2009-09-25 21 views
37

Tôi có giải pháp với hai dự án có liên quan (cho câu hỏi này) và một vài dự án khác;Tôi nên tiêm ở đâu với Ninject 2+ (và làm cách nào để sắp xếp Mô-đun của tôi?)

  1. Thư viện lớp học có chức năng được một số dự án khác sử dụng.
  2. Ứng dụng ASP.NET MVC.

Câu hỏi của tôi về cơ bản là nơi tôi nên làm IoC với Ninject 2, xem xét ...

  • Thư viện lớp cần một số DI tình yêu, trong số những thứ khác trong lớp kho mà cần web phiên cụ thể theo yêu cầu đối tượng (nghĩ đơn vị công việc).
  • Ứng dụng MVC cần DI kể từ khi Ninject 2 bạn về cơ bản kế thừa từ NinjectHttpApplication.
  • Kiểm tra đơn vị cho thư viện lớp cần phải biết điều này để tiêm một tập hợp các kho lưu trữ khác.
  • Kiểm tra đơn vị cho ứng dụng web cần phải được tiêm cùng lý do.

Tôi đã vẽ bản thân mình vào một góc tinh thần ở đây, bởi vì tôi chỉ thấy ba tùy chọn để bắt đầu. DI trong thư viện lớp, DI trong ứng dụng web, hoặc cả hai, nhưng có những vấn đề với nhau:

  • tôi không thể làm DI chỉ trong thư viện lớp kể từ khi ứng dụng MVC cần phải kế thừa từ NinjectHttpApplication để bắt đầu với.
  • Tôi không thể làm DI chỉ trong ứng dụng MVC - thư viện lớp được sử dụng bởi các thư viện khác, sau khi tất cả, và các ứng dụng MVC không nên biết quá nhiều về nội bộ của thư viện anyway.
  • Tôi đoán đây là cách duy nhất tôi có thể thấy: IoC độc lập cho cả hai dự án. Thư viện lớp và ứng dụng MVC đều có thiết lập IoC của riêng họ và làm DI cho công cụ của họ mà không thực sự quan tâm lẫn nhau.

Có ai có một số "phương pháp hay nhất" hoặc hướng dẫn về cách thực hiện điều gì đó như thế này không? Tôi không thể tưởng tượng tôi là người đầu tiên kết thúc trong tình huống này, và chắc chắn sẽ rất hay khi biết cách "thích hợp" để làm điều này là ...

Cảm ơn!

+1

liên quan: http://stackoverflow.com/questions/5267525/dal-bll-gui-composition-root-how-to-setup-di-bindings –

+1

Trùng lặp với một số nhận xét đáng để khai thác để hoàn thành nếu bạn thực sự cố gắng để có được thông tin chi tiết đầy đủ http://stackoverflow.com/questions/5733591/best-location-for-fluent-ioc-configuration-modules-currently-trying-ninject –

Trả lời

63

Tôi không biết NInject, nhưng trừ khi nó hoạt động rất khác với Windsor, StructureMap, vv các câu trả lời có xu hướng giữ nguyên, vì có một số mẫu DI phổ biến. Với ý nghĩ đó:

Điều đầu tiên cần nhận ra là DI không được gắn với một khuôn khổ cụ thể như NInject hoặc Windsor. Nó là một tập hợp các kỹ thuật và các mẫu thiết kế để theo dõi. Bạn có thể làm DI bằng tay bằng cách sử dụng cái gọi là DI của người nghèo, nhưng rõ ràng nó được tốt hơn nhiều với một DI Container.

Tại sao điều này có liên quan? Nó có liên quan bởi vì một khi bạn nhận ra điều này, hệ quả là phần lớn mã ứng dụng của bạn nên có không có kiến ​​thức về phần tử DI Container.

Vậy bạn sử dụng DI Container ở đâu? Nó chỉ nên được sử dụng trong một Thành phần gốc, trong trường hợp của bạn sẽ tương ứng với Global.asax.Bạn có thể đọc thêm một chút về điều này trong this SO answer - mặc dù câu hỏi đó là về Windsor, nguyên tắc vẫn giữ nguyên.

Xét nghiệm đơn vị của bạn thì sao? Họ cũng nên hoàn toàn không biết gì về DI Container. Xem this other SO answer để biết thêm chi tiết.

DI có thể đạt được trong thư viện của bạn với việc sử dụng phong phú Constructor Injection. Bạn không cần phải tham khảo bất kỳ DI Container nào để làm điều đó, nhưng nó làm cho cuộc sống dễ dàng hơn rất nhiều nếu bạn sử dụng một DI Container để giải quyết tất cả các phụ thuộc từ Root Root.

+0

Xin chào Mark - cảm ơn câu trả lời, tôi nghĩ rằng tôi nhận được nó bây giờ, ít nhất là hầu hết. Tuy nhiên, nếu MVC/Global.asax có trách nhiệm thiết lập tất cả DI, nó sẽ cần phải poke vào các công cụ thư viện lớp học là tốt? Hãy xem xét rằng thư viện lớp có thể cần lưu trữ một ISession theo yêu cầu web hoặc một cái gì đó tương tự, mà sẽ được sử dụng để xây dựng tất cả các lớp kho lưu trữ. Ứng dụng MVC có biết về điều này không? Chỉ cần cố gắng để quấn đầu của tôi xung quanh "The Right Thing" để làm. :) –

+1

Vì bạn đang sử dụng MVC, lựa chọn tốt nhất của bạn là sử dụng ControllerFactory tùy chỉnh để tạo Bộ điều khiển với tất cả các phụ thuộc của chúng. Bạn có thể xem ví dụ về điều này với Windsor trong mã nguồn MvcContrib: http://github.com/mvccontrib/MvcContrib/blob/be0eb3addedf1775db719117e7fa73e516f74c8d/src/MvcContrib.Castle/WindsorControllerFactory.cs Nếu một số phụ thuộc là các loại trong thư viện của bạn , chúng sẽ được Bộ điều khiển nhập khẩu. Nếu bạn cần truyền các thể hiện ISession vào thư viện của bạn, bạn có thể sử dụng ctx của Controller để làm điều đó - nó sẽ được thiết lập bởi Nhà máy tùy chỉnh của bạn. –

+0

Cảm ơn một lần nữa, Mark. Tôi sẽ phải thử nó - không có gì thực sự làm việc, tôi đoán vậy. Ninject là mô-đun dựa trên vì vậy có thể tôi có thể tạo ra một mô-đun riêng biệt trong thư viện lớp của tôi được tự động sử dụng bởi thiết lập IoC trong ứng dụng MVC là tốt, tôi sẽ chỉ phải thử nó ra. Mucho gracias! –

Các vấn đề liên quan