2009-08-12 23 views
28

cũng Which C#/.NET Dependency Injection frameworks are worth looking into?tôi nên xem xét gì khi lựa chọn một khuôn khổ dependency injection cho .NET

thấy bây giờ có rất nhiều dependencyinjection khung để lựa chọn. Bạn thường bị buộc phải sử dụng một khuôn khổ tiêm phụ thuộc nhất định do một thư viện bạn đang sử dụng. Tuy nhiên, Common Service Locator library đã cho phép mã thư viện độc lập với các khuôn khổ tiêm.

Thời gian cần để tìm hiểu tất cả chúng đủ tốt để quyết định sử dụng nào là không hợp lý. Tôi không tin rằng chúng ta chưa đạt đến một giai đoạn mà chúng ta có thể nói về khuôn khổ tiêm phụ thuộc tốt nhất. Vậy tôi nên hỏi những câu hỏi nào về dự án và bản thân mình để giúp quyết định khung tiêm phụ thuộc tốt nhất để sử dụng trong một trường hợp cụ thể? Bạn cũng nên biết tại sao bạn chọn khung tiêm phụ thuộc mà bạn hiện đang sử dụng và nếu bạn vẫn hài lòng với lựa chọn đó.

Có từ vựng hữu ích nào để sử dụng khi so sánh các kiểu khuôn khổ tiêm phụ thuộc không?

Thư viện định vị dịch vụ có hoạt động trong đời thực hay bạn có kỹ năng buộc phải sử dụng nhiều khung tiêm phụ thuộc khác nhau trong cùng một dự án không?

Cách dễ dàng để khúc xạ bạn mã với từng Khuôn khổ phụ thuộc Injection, ví dụ: các công cụ như ReSharper có hoạt động tốt với một khuôn khổ nhất định không?

Trả lời

15

FYI, chỉ sáng nay tôi đi qua một so sánh thú vị giữa tất cả các container IoC NET ở đây:

http://elegantcode.com/2009/01/07/ioc-libraries-compared/

Một số ít các câu hỏi sau:

  1. bao nhiêu hỗ trợ chính thống làm bạn cần? Mùa xuân có lẽ là mùa lớn nhất. Mọi người đều đã sử dụng nó hoặc đã nghe nói về nó bây giờ, rất nhiều thông tin. Nó cũng có thể có số lượng lớn nhất các tính năng, nhưng điều đó có nghĩa là chỉ có nhiều hơn để tìm hiểu. Một container nhỏ hơn như Autofac có thể là tốt đẹp, nhưng bạn có thể gặp một vấn đề bạn sẽ không tìm thấy sự trợ giúp.
  2. Bạn có cấu hình w/Xml tiện dụng không? Mỗi thùng chứa IoC đều dựa vào cấu hình và thiết lập một số loại. Mùa xuân và Unity Xml nặng.
  3. Đây có phải là sự lựa chọn vĩnh viễn không? Nếu bạn đang ở một trong những nơi mà bạn chỉ nhận được một shot tại một sự lựa chọn, nó sẽ không thành vấn đề. Nhưng, nếu bạn muốn chọn một giải pháp khác trên đường, bạn có thể không muốn một IoC yêu cầu bạn phân bổ các lớp của bạn (phân loại nghịch đảo của câu hỏi trên) bởi vì bạn sẽ ghét bản thân khi bạn phải trích xuất tất cả công cụ đó. Trong khi đó, wwapping ra một số cấu hình xml có thể không phải là đau đớn.
  4. Cửa hàng của bạn như thế nào? Tôi gặp sự cố khi quảng cáo chiêu hàng một vài tùy chọn nguồn mở chỉ vì "thở hổn hển! Không phải là Microsoft!" phản ứng. Nếu bạn là một cửa hàng MS thẳng, sử dụng Unity sẽ là một chiến thắng văn hóa dễ dàng hơn nhiều.

Trên một lưu ý cá nhân:

Tôi đã sử dụng StructureMap vì những lý do tương tự được đề cập trong blog của tôi liên kết.Tôi nghĩ rằng cấu hình Xml là một nỗi đau khổng lồ để duy trì và, đặc biệt là, gỡ lỗi (xem WCF). Tôi chưa thử Ninject, nhưng dựa trên tiếp thị của họ, nó phải là siêu rad!

+2

tôi đã có phản ứng ngược lại với # 4, tôi đã có, "nó không phải là mã nguồn mở". – Chris

+3

Thật sao? Wow, thật tuyệt. Tôi đã chiến đấu trong một thời gian dài. Bạn sẽ không tin vào những giao dịch không thực sự mà tôi phải thực hiện để có NHibernate ở đây ;-) –

+1

# 1 là một sự cân nhắc hợp lệ, nhưng sự hỗ trợ không phải lúc nào cũng là một chức năng của kích thước userbase và đôi khi ngược lại. Ví dụ. cho Autofac - chúng tôi đã có một trong những diễn đàn người dùng phản hồi và hữu ích nhất trên 'net :) Các tùy chọn ít chủ đạo khác, (ví dụ: Ninject) cũng xuất hiện để có sự hỗ trợ tuyệt vời. –

2

Tôi nghĩ rằng sự lựa chọn đi xuống để tìm một khuôn khổ đáp ứng yêu cầu của bạn và sau đó là sở thích cá nhân.

Dự án của bạn đã sử dụng thư viện như công cụ tê giác đã tích hợp với khung DI chưa? Nếu có, đó có thể là điểm khởi đầu tốt nếu bạn muốn tránh sử dụng "nhiều khung tiêm phụ thuộc khác nhau".

Check-out hai bài viết này:

2

mùa xuân và Unity là Xml nặng.

Tôi sẽ không đồng ý với tuyên bố đó cho Unity; bạn có thể viết

container.RegisterType<IRobot, MrRoboto>(); 

và thiết lập mã bằng giao diện kiểu thông thạo. Cá nhân tôi thích Unity.

6

Thật khó để trả lời mà khuôn khổ là 'tốt nhất', nhưng tôi có thể cho bạn biết khuôn khổ là dễ nhất: Các Injector đơn giản:

Các Injector đơn giản là một Inversion-to dễ sử dụng thư viện Kiểm soát cho .NET và Silverlight. Nó chỉ hỗ trợ cấu hình code-based và là một điểm khởi đầu lý tưởng cho các nhà phát triển quen thuộc với các thư viện lớn hơn IoC/ DI

http://simpleinjector.codeplex.com/

Shameless plug btw ;-)

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