2008-08-21 39 views
338

Các khuôn khổ C# /. NET Dependency Injection nào đáng xem? Và bạn có thể nói gì về sự phức tạp và tốc độ của chúng.Khuôn khổ .NET Dependency Injection nào đáng xem?

+13

[Điểm chuẩn IoC Container - So sánh hiệu suất] (http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison) có hiệu suất và các tính năng so sánh các bảng cho hơn 20 sản phẩm và cập nhật cho họ. Nó khuyến nghị [Simple Injector] (http://simpleinjector.codeplex.com/) –

+0

Tôi đánh giá cao Ninject & Maestro. Tôi rất vui vì câu trả lời được đánh giá cao nhất là Ninquan là "một niềm vui tuyệt đối" –

+2

Tôi muốn nhấn mạnh rằng trước khi bạn nhìn vào các thùng chứa IoC, bạn nên quản lý mà không cần một. Làm dây và tiêm của bạn bằng tay, nó không thực sự phức tạp hoặc đòi hỏi rất nhiều mã ở tất cả 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à rằng nó đang trở nên cồng kềnh, bạn sẽ được kết hợp tốt hơn để hiểu loại khuôn khổ 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 thùng chứa IoC chỉ để có thể thực hiện DI đúng cách. – kai

Trả lời

297

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

  • Castle Windsor - Lâu đài Windsor là hạt giống tốt nhất, Inversion trưởng thành của container điều khiển có sẵn cho .NET và Silverlight
  • Unity - Trọng lượng nhẹ có thể mở rộng chứa dependency injection với sự hỗ trợ cho xây dựng, bất động sản, và gọi phương thức tiêm
  • Autofac - Một nghiện NET IoC tiếp ainer
  • DryIoc - Đơn giản, nhanh chóng tất cả các container IoC đầy đủ tính năng.
  • Ninject - Các ninja của .NET phun phụ thuộc
  • StructureMap - Bản gốc IoC/DI container cho Net
  • Spring.Net - Spring.NET là một ứng dụng mã nguồn mở khuôn khổ mà làm cho việc xây dựng các ứng dụng doanh nghiệp NET dễ dàng hơn
  • LightInject - Hộp chứa IoC siêu nhẹ
  • Simple Injector - Simple Injector là 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 ứng dụng Universal và Mono .
  • Microsoft.Extensions.DependencyInjection - Vùng chứa IoC mặc định cho các ứng dụng ASP.NET Core.
  • Scrutor - Tiện ích mở rộng quét hội cho Microsoft.Extensions.DependencyInjection.
  • VS MEF - Triển khai khung công tác mở rộng được quản lý (MEF) được Visual Studio sử dụng.
  • TinyIoC - Dễ sử dụng, rắc rối miễn phí, Đảo ngược vùng chứa kiểm soát 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.


Tôi cho rằng tôi có thể là một chút kén chọn ở đây nhưng điều quan trọng cần lưu ý là DI (Dependency Injection) là một mô hình lập trình và được tạo điều kiện bằng cách, nhưng không đòi hỏi, một IoC (Inversion of Control) khuôn khổ . Các khuôn khổ 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 hơn và cao hơn DI.

Điều đó đang được nói, tôi chắc chắn đó là những gì bạn đang yêu cầu. Giới thiệu về IoC Frameworks; Tôi từng sử dụng Spring.NetCastleWindsor rất nhiều, nhưng nỗi đau thực sự ở đằng sau là tất cả cấu hình XML phức tạp mà bạn phải viết! Bây giờ, chúng tôi đang sử dụng StructureMap cho năm ngoái, và vì nó đã chuyển sang cấu hình thông thạo bằng cách sử dụng Generics gõ mạnh mẽ và đă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! Tôi nhận được một khởi đầu 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 điểm biên dịch (phần lớn) và tôi không có gì ngoài niềm vui với StructureMap và tốc độ của nó. Tôi sẽ không nói rằng những người khác đã chậm chạp trong thời gian chạy, nhưng họ đã khó khăn hơn cho tôi để thiết lập và thất vọng thường giành chiến thắng trong ngày.

Cập nhật

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

Các buổi phát sóng IoC khác cũng có thể được tìm thấy here on Dimecasts.

+1

Thật tuyệt vời khi thấy chất lượng, cũng nghĩ ra câu trả lời tăng về một lớp lót. Bạn đã thuyết phục tôi kiểm tra StructureMap. –

+6

Đẹp nhưng công bằng - Windsor cũng có giao diện thông thạo rất chính xác. –

+0

Bạn có thể giải thích những gì là "máy chủ của các lợi ích khác" khuôn khổ IoC cung cấp bên cạnh việc thực hiện dễ dàng DI? – fearofawhackplanet

18

Ninject thật tuyệt. Nó có vẻ thực sự nhanh chóng, nhưng tôi đã không thực hiện bất kỳ so sánh. 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 công tác DI khác và đang tìm kiếm thêm nhiều cách để cải thiện tốc độ của Ninject.

Tôi đã nghe rất nhiều người tôi tôn trọng những điều tốt đẹp về StructureMap 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 là không nhanh. Nó thực sự là một trong những chậm nhất hiện có: http://www.palmmedia.de/Blog/2011/8/30/ioc-container-benchmark-performance-comparison –

4

Tôi đã sử dụng Spring.NET trong quá khứ và đã thành công lớn với nó. Tôi không 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 số documentation để thiết lập.

2

Điều tuyệt vời về C# là nó đang theo một con đường bị đánh bại bởi nhiều năm phát triển Java trước đó. 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ủa bản chất này, là để tìm câu trả lời Java vững chắc và xem nếu có tồn tại một.

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

Cuối cùng, có rất nhiều khung công tác DI và đặt cược 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 dự án mẫu và đưa ra lựa chọn có kiến ​​thức.

Chúc may mắn!

35

Tự động điền. https://github.com/autofac/Autofac Nó thực sự nhanh và khá tốt. Đây là một liên kết với các so sánh (được thực hiện sau khi Ninject cố định một vấn đề rò rỉ bộ nhớ).

http://www.codinginstinct.com/2008/05/ioc-container-benchmark-rerevisted.html

+0

Tôi thích tự động nhưng nó chắc chắn không nhanh. Như Steven đã liên kết ở trên: http://www.palmmedia.de/Blog/2011/8/30/ioc-container-benchmark-performance-comparison –

2

Tôi nghĩ rằng một nơi tốt để bắt đầu là với Ninject, nó là mới và đã đưa vào rất nhiều tài khoản của tinh chỉnh và thực sự nhanh. 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.

+0

Tại sao bạn nói nhanh? Nó là một trong những chậm nhất có! http://www.palmmedia.de/Blog/2011/8/30/ioc-container-benchmark-performance-comparison –

5

Tôi có thể đề xuất 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, bạn nên sử dụng Windsor.

+0

KHÔNG nhanh! Nó là một trong những khuôn khổ DI chậm nhất hiện có! http://www.palmmedia.de/Blog/2011/8/30/ioc-container-benchmark-performance-comparison –

+0

@Serj Sagan Để công bằng, những kết quả đó là cổ đại (6 tuổi hiện nay) –

+2

https: // www.akshaysura.com/2016/08/31/ioc-container-benchmark-comparison-2016-including-microsoft-extensions-dependencyinjection/ –

8

Tôi là một fan hâm mộ lớn của lâu đài. Tôi yêu các cơ sở nó cũng cung cấp vượt ra ngoài câu chuyện IoC Container. Nó thực sự simplfies bằng cách sử dụng NHibernate, đăng nhập, AOP, vv Tôi cũng sử dụng Binsor cho cấu hình với Boo và đã thực sự rơi vào tình yêu với Boo như một ngôn ngữ vì nó.

2

Mùa xuân.Net là khá vững chắc, nhưng các tài liệu 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ó, hoặc người nào khác sử dụng dòng lệnh để xây dựng ứng dụng của bạn.

74

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

  1. Spring.NET là trưởng thành nhất vì nó đi ra của mùa xuân từ thế giới Java. Mùa xuân có một bộ thư viện khung rất phong phú mở rộng nó để hỗ trợ Web, Windows, v.v.
  2. Castle Windsor là một trong những hệ thố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ó thể cấu hình/mở rộng cao, có quản lý tùy chỉnh suốt đời, hỗ trợ AOP, đã hỗ trợ NHibernate vốn có và là một vùng chứa xung quanh tuyệt vời. Windsor là một phần của toàn bộ một chồng bao gồm Monorail, Active Record, vv NHibernate tự xây dựng trên đầu trang của Windsor.
  3. Structure Map có cấu hình hạt rất phong phú và mịn thông qua DSL nội bộ.
  4. Autofac là một thùng chứa IoC ở độ tuổi mới với tất 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ý cuộc đời hơn những người khác. Autofac vẫn còn rất mới, nhưng nó đẩy thanh trên những gì có thể với IoC.
  5. Ninject Tôi đã nghe là có nhiều xương trần hơn với ít tiếp cận hơn (nghe không có kinh nghiệm).
  6. Phân biệt đối xử lớn nhất của Unity là: 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ó thể cấu hình cao. Nó không có tất cả các chuông và còi nói Castle/Structure Map.

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

+4

Autofac thực sự không phải là quá mới, nó cũ hơn Unity :) –

+0

Tôi đã nói nó mới hơn Unity? Tôi nói đó là thời đại mới ... tức là tôi có nghĩa là tính 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, những gì tôi có nghĩa là mặc dù nó là bản chất không phải là CNTT mới. :-) –

+2

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

12

tôi sử dụng Simple Injector:

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

+4

Hãy coi chừng một số xem xét định vị dịch vụ chống mẫu, bao gồm một người sử dụng nó một thời gian và thậm chí đã viết một thư viện cho nó: http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/ – Philippe

+2

Steven cũng là tác giả của Simple Injector ... vì vậy đây là loại câu trả lời spam ... đặc biệt là anh ta đã sử dụng một tài khoản alt để làm như vậy ... Simple Injector là khá nhanh mặc dù: http://www.palmmedia.de/Blog/2011/8/30/ioc-container- so sánh hiệu suất chuẩn –

4

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

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