Những khuôn khổ .NET Dependency Injection nào đáng để xem xét? [đóng cửa]


386

Những khung công tác phụ thuộc C # /. NET nào đáng để xem xét? Và bạn có thể nói gì về sự phức tạp và tốc độ của chúng.


13
IoC Container Benchmark - So sánh hiệu suất có các bảng so sánh hiệu năng và tính năng cho hơn 20 sản phẩm và luôn cập nhật chúng. Nó khuyến nghị
In

Tôi đánh giá cao Ninject & Maestro. Tôi rất vui khi câu trả lời được xếp hạng hàng đầu giới thiệu Ninject là "một niềm vui tuyệt đối"
Razvan Dumitru

6
Tôi nhấn mạnh rằng trước khi bạn xem xét các container IoC, bạn nên quản lý mà không cần một cái nào. Thực hiện nối dây và tiêm thủ công, nó không thực sự phức tạp hoặc đòi hỏi nhiều mã, trừ khi bạn có một số hệ thống thực sự phức tạp hoặc lớn. Khi bạn cảm thấy rằng bạn hiểu nó và nó đang trở nên hài hước, bạn sẽ được khuyến khích tốt hơn để hiểu loại khung nào giúp bạn. nhưng không có quy tắc nào nói rằng một dự án PHẢI có một bộ chứa IoC chỉ để có thể thực hiện DI đúng cách.
sara

1
Bắt đầu với không có. Tạo đồ thị đối tượng yêu cầu bằng tay. Các khuôn khổ khác nhau có cách tiếp cận khác nhau phụ thuộc vào nhu cầu của bạn. Trước khi chọn một, bạn cần nhận ra những tính năng bạn cần nhất.
Fabio

Vì dotnetcore là tương lai, bạn cũng có thể gắn bó với hỗ trợ DI tích hợp. Nó rất tốt và tùy biến cao.
ATL_DEV

Câu trả lời:


339

chỉnh sửa (không phải bởi tác giả): Có một danh sách toàn diện về các khung IoC có sẵn tại https://github.com/quozd/awclaw-dotnet/blob/master/README.md#ioc :

  • Castle Windsor - Castle Windsor là giống tốt nhất, thùng chứa Inversion of Control trưởng thành có sẵn cho .NET và Silverlight
  • Unity - Container tiêm phụ thuộc có thể mở rộng nhẹ với sự hỗ trợ cho hàm tạo, thuộc tính và lệnh gọi phương thức
  • Autofac - Một container .NET IoC gây nghiện
  • DryIoc - Đơn giản, nhanh chóng tất cả các container IoC đầy đủ tính năng.
  • Ninject - ninja của người tiêm phụ thuộc .NET
  • StructMap - Container IoC / DI ban đầu cho .Net
  • Spring.Net - Spring.NET là một khung ứng dụng mã nguồn mở giúp việc xây dựng các ứng dụng .NET doanh nghiệp dễ dàng hơn
  • LightInject - Một container IoC siêu nhẹ
  • Simple In phun - Simple In phun là một thư viện Dependency Injection (DI) dễ sử dụng cho .NET 4+ hỗ trợ Silverlight 4+, Windows Phone 8, Windows 8 bao gồm các ứng dụng Universal và Mono.
  • Microsoft.Extensions.DependencyInjection - Bộ chứa IoC mặc định cho các ứng dụng ASP.NET Core.
  • Scrutor - Phần mở rộng quét hội cho Microsoft.Extensions.DependencyInjection.
  • VS MEF - Triển khai Khung mở rộng được quản lý (MEF) được sử dụng bởi Visual Studio.
  • TinyIoC - Dễ sử dụng, không rắc rối, Inversion of Control Container cho các dự án nhỏ, thư viện và người mới bắt đầu.

Câu trả lời gốc sau đây.


Tôi cho rằng tôi có thể hơi kén chọn ở đây nhưng điều quan trọng cần lưu ý là DI (Dependency Injection) là một mẫu lập trình và được hỗ trợ bởi, nhưng không yêu cầu, khung IoC (Inversion of Control). Các khung IoC chỉ làm cho DI dễ dàng hơn nhiều và chúng cung cấp một loạt các lợi ích khác trên và trên DI.

Điều đó đang được nói, tôi chắc chắn đó là những gì bạn đang hỏi. Về khung IoC; Tôi đã từng sử dụng Spring.NetCastleWindsor rất nhiều, nhưng nỗi đau thực sự ở phía sau là tất cả những cấu hình XML phiền phức mà bạn phải viết! Bây giờ họ gần như đã di chuyển theo cách này, vì vậy tôi đã sử dụng StructMap trong năm ngoái hoặc lâu hơn, và vì nó đã chuyển sang một cấu hình trôi chảy bằng cách sử dụng các tướng được đánh máy mạnh và một sổ đăng ký, rào cản đau đớn của tôi khi sử dụng IoC đã giảm xuống dưới không! Bây giờ tôi nhận được một cú đá tuyệt đối khi biết rằng cấu hình IoC của tôi được kiểm tra tại thời gian biên dịch (phần lớn) và tôi không có gì ngoài niềm vui với StructMap và tốc độ của nó. Tôi sẽ không nói rằng những người khác chậm trong thời gian chạy, nhưng họ khó thiết lập hơn và sự thất vọng thường chiến thắng trong ngày.

Cập nhật

Tôi đã sử dụng Ninject trong dự án mới nhất của mình và nó là một niềm vui tuyệt đối khi sử dụng. Từ ngữ làm tôi thất vọng một chút ở đây, nhưng (như chúng tôi nói ở Anh) khuôn khổ này là 'Những chú chó'. Tôi rất muốn giới thiệu nó cho bất kỳ dự án lĩnh vực xanh nào mà bạn muốn lên và chạy nhanh. Tôi đã có tất cả những gì tôi cần từ một bộ screencasts tuyệt vời của Justin Etheredge. Tôi không thể thấy rằng Ninject phù hợp với retro vào mã hiện tại là một vấn đề, nhưng sau đó có thể nói tương tự về StructMap theo kinh nghiệm của tôi. Đó sẽ là một lựa chọn khó khăn trong tương lai giữa hai người đó, nhưng tôi muốn cạnh tranh hơn là trì trệ và có một số lượng cạnh tranh lành mạnh ngoài kia.

Các screencasts IoC khác cũng có thể được tìm thấy ở đây trên Dimitions .


1
Thật tuyệt khi thấy một câu trả lời chất lượng, được suy nghĩ kỹ càng tăng về một lớp lót. Bạn đã thuyết phục tôi kiểm tra StructMap.
Chris Marasti-Georg

7
Đẹp nhưng công bằng mà nói - giờ đây, Windsor cũng có một giao diện lưu loát hoàn toàn rất đẹp.
Krzysztof Kozmic

Bạn có thể giải thích "các lợi ích khác" của các khung IoC cung cấp bên cạnh việc triển khai DI dễ dàng là gì không?
sợofawhackplanet

@fearofawhackplanet một trong những điều duy nhất mà một container IoC có thể làm mà không thể thực hiện được với DI của người nghèoĐánh chặn . Tóm tắt hay tại đây: kenneth-truyers.net/2013/05/16/ từ
Mathieu Guindon

1
Tôi đã đọc một vài nguồn nói rằng Ninject là palmmedia chậm nhất.de / blog / 2011/8/30 / Giảstackoverflow.com/questions/4581791/
Luke T O'Brien

77

Nó phụ thuộc vào những gì bạn đang tìm kiếm, vì mỗi người đều có ưu và nhược điểm của họ.

  1. Spring.NETlà sự trưởng thành nhất khi nó ra khỏi Spring từ thế giới Java. Spring có một bộ thư viện khung rất phong phú giúp mở rộng nó để hỗ trợ Web, Windows, v.v.
  2. Castle Windsorlà một trong những nền tảng được sử dụng rộng rãi nhất trong nền tảng .NET và có hệ sinh thái lớn nhất, có khả năng cấu hình / mở rộng cao, có quản lý trọn đời tùy chỉnh, hỗ trợ AOP, có hỗ trợ NHibernate vốn có và là một công cụ tuyệt vời. Windsor là một phần của toàn bộ ngăn xếp bao gồm Monorail, Active Record, v.v ... Bản thân NHibernate xây dựng trên đỉnh của Windsor.
  3. Structure Map có cấu hình hạt rất phong phú và tốt thông qua DSL bên trong.
  4. Autofaclà một kho chứa IoC của thời đại mới với tất cả các hỗ trợ lập trình chức năng vốn có của nó. Nó cũng có một cách tiếp cận khác nhau về quản lý suốt đời so với những người khác. Autofac vẫn còn rất mới, nhưng nó thúc đẩy những gì có thể với IoC.
  5. Ninject Tôi đã nghe nói là xương trần nhiều hơn với một cách tiếp cận ít hơn (nghe không có kinh nghiệm).
  6. Phân biệt đối xử lớn nhất Unitylà: nó đến từ và được hỗ trợ bởi Microsoft (p & p). Unity có hiệu suất rất tốt, và tài liệu tuyệt vời. Nó cũng có cấu hình cao. Nó không có tất cả các tiếng chuông và tiếng huýt sáo của Lâu đài / Bản đồ cấu trúc.

Vì vậy, tóm lại, nó thực sự phụ thuộc vào những gì quan trọng với bạn. Tôi sẽ đồng ý với những người khác đi và đánh giá và xem cái nào phù hợp. Điều tuyệt vời là bạn có một lựa chọn tốt về bánh rán thay vì chỉ có một viên thạch.


4
Autofac thực sự không quá mới, nó cũ hơn Unity :)
Nicholas Blumhardt

1
Tôi có nói nó mới hơn Unity không? Tôi đã nói nó thuộc thời đại mới ... nghĩa là bản chất chức năng của nó. OK, những gì tôi nói nó vẫn còn rất mới, điều tôi muốn nói là bản chất không phải là CNTT mới. :-)
Khối Glenn

2
@Krzysztof - Tôi thấy Unity dễ chết (ít nhất là khi được cấu hình thành thạo mã). Bạn thấy đau là gì?
TrueWill


6
Đây là một điểm chuẩn hiệu suất thú vị: palmmedia.de/Blog/2011/8/30/NH
Steven


18

Ninject là tuyệt vời. Có vẻ như rất nhanh, nhưng tôi chưa thực hiện bất kỳ so sánh nào. Tôi biết Nate, tác giả, đã thực hiện một số so sánh giữa Ninject và các khung DI khác và đang tìm kiếm nhiều cách hơn để cải thiện tốc độ của Ninject.

Tôi đã nghe nhiều người tôi tôn trọng nói những điều hay về StructMap và CastleWindsor. Những người, trong tâm trí của tôi, là ba người lớn để xem xét ngay bây giờ.


1
Ninject là phổ biến nhưng nó chắc chắn KHÔNG nhanh. Nó thực sự là một trong những thứ chậm nhất ngoài kia: palmmedia.de/Blog/2011/8/30/NH
Serj Sagan

13

Tôi sử dụng In phun đơn giản :

Simple In phun là một thư viện tiêm phụ thuộc dễ dàng, linh hoạt và nhanh chóng, sử dụng thực tiễn tốt nhất để hướng dẫn các giải pháp của bạn hướng tới hố thành công.


4
Coi chừng một số người coi bộ định vị dịch vụ là một mô hình chống, bao gồm cả người đã sử dụng nó một thời gian và thậm chí đã viết một thư viện cho nó: blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Potype
Philippe

4
Steven cũng là người tạo ra Simple In phun ... vì vậy đây là một câu trả lời spam ... đặc biệt là anh ta đã sử dụng tài khoản alt để làm như vậy ... Tuy nhiên, Simple In
8/30

8

Tôi là một fan hâm mộ lớn của Castle. Tôi yêu các cơ sở mà nó cũng cung cấp ngoài câu chuyện IoC Container. Nó thực sự đơn giản khi sử dụng NHibernate, đăng nhập, AOP, v.v. Tôi cũng sử dụng Binsor để cấu hình với Boo và đã thực sự yêu Boo như một ngôn ngữ vì nó.


5

Tôi có thể giới thiệu Ninject. Nó cực kỳ nhanh và dễ sử dụng nhưng chỉ khi bạn không cần cấu hình XML, thì bạn mới nên sử dụng Windsor.


1
Nó KHÔNG nhanh! Đây là một trong những khung DI chậm nhất hiện có! palmmedia.de/Blog/2011/8/30/NH
Serj Sagan

@Serj Sagan Công bằng mà nói, những kết quả đó là cổ xưa (6 tuổi bây giờ)
Timothy Kanski


5

Tôi đã dành phần tốt hơn của một ngày vật lộn mà không thành công để có được ví dụ Spring.NET đơn giản nhất hoạt động. Không bao giờ có thể tìm ra làm thế nào để nó tìm thấy tập hợp của tôi từ tệp XML. Trong khoảng 2 giờ, mặt khác, tôi đã có thể khiến Ninject hoạt động, bao gồm thử nghiệm tích hợp với cả NUnit và MSTest.


4

Tôi đã sử dụng Spring.NET trong quá khứ và đã thành công lớn với nó. Tôi chưa bao giờ nhận thấy bất kỳ chi phí đáng kể nào với nó, mặc dù dự án chúng tôi sử dụng nó khá nặng nề. Chỉ mất một ít thời gian đọc qua tài liệu để thiết lập nó.


2

Điều tuyệt vời về C # là nó đang đi theo một con đường bị đánh bại bởi nhiều năm của các nhà phát triển Java trước nó. Vì vậy, lời khuyên của tôi, nói chung khi tìm kiếm các công cụ có tính chất này, là tìm kiếm câu trả lời Java vững chắc và xem có tồn tại một sự thích ứng .NET nào không.

Vì vậy, khi nói đến DI (và có rất nhiều lựa chọn ngoài kia, đây thực sự là một vấn đề của hương vị) là Spring.NET . Ngoài ra, luôn luôn khôn ngoan để nghiên cứu những người đằng sau các dự án. Tôi không có vấn đề gì khi đề xuất các sản phẩm SourceGear để kiểm soát nguồn (bên ngoài việc sử dụng chúng) vì tôi tôn trọng Eric chìm. Tôi đã thấy Mark Pollack nói và tôi có thể nói gì, anh chàng chỉ cần có nó.

Cuối cùng, có rất nhiều khung DI và cách tốt nhất của bạn là thực hiện một số dự án mẫu với một vài trong số chúng và đưa ra lựa chọn có giáo dục.

Chúc may mắn!


2

Tôi nghĩ rằng một nơi tốt để bắt đầu là với Ninject, nó mới và đã được tính đến rất nhiều điều chỉnh tốt và thực sự nhanh chóng. Nate, nhà phát triển, thực sự có một trang web tuyệt vời và hỗ trợ tuyệt vời.


Tại sao bạn nói nó nhanh ??? Đó là một trong những chậm nhất mà có! palmmedia.de/Blog/2011/8/30/NH
Serj Sagan

2

Spring.Net khá vững chắc, nhưng tài liệu phải mất một thời gian để lội qua. Autofac là tốt và trong khi .Net 2.0 được hỗ trợ, bạn cần VS 2008 để biên dịch nó, nếu không thì sử dụng dòng lệnh để xây dựng ứng dụng của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.