哪些 .NET 依赖注入框架值得研究? [关闭]
Posted
技术标签:
【中文标题】哪些 .NET 依赖注入框架值得研究? [关闭]【英文标题】:Which .NET Dependency Injection frameworks are worth looking into? [closed] 【发布时间】:2010-09-06 11:36:17 【问题描述】:哪些 C#/.NET 依赖注入框架值得研究? 您如何评价它们的复杂性和速度。
【问题讨论】:
IoC Container Benchmark - Performance comparison 有 20 多种产品的性能和功能比较表,并保持最新状态。推荐Simple Injector 我很欣赏 Ninject & Maestro。我很高兴最高评价的答案将 Ninject 称为“绝对的乐趣” 我要强调的是,在您研究 IoC 容器之前,您应该在没有容器的情况下进行管理。手动进行接线和注入,这并不复杂或根本不需要大量代码,除非您有一些非常复杂或大型系统。当你觉得你理解它并且它变得精巧时,你将更适合理解什么样的框架可以帮助你。但是没有规定说一个项目必须有一个 IoC 容器才能正确执行 DI。 从无开始。手动创建所需的对象图。不同的框架有不同的方法,这取决于您的需求。在选择一个之前,您需要确定您最需要哪些功能。 既然 dotnetcore 是未来,您不妨坚持其内置的 DI 支持。它非常好并且高度可定制。 【参考方案1】:编辑(不是作者):https://github.com/quozd/awesome-dotnet/blob/master/README.md#ioc 上提供了 IoC 框架的完整列表:
Castle Windsor - Castle Windsor 是同类最佳、成熟的控制反转容器,可用于 .NET 和 Silverlight Unity - 支持构造函数、属性和方法调用注入的轻量级可扩展依赖注入容器 Autofac - 令人上瘾的 .NET IoC 容器 DryIoc - 简单、快速的全功能 IoC 容器。 Ninject - .NET 依赖注入器的忍者 Spring.Net - Spring.NET 是一个开源应用程序框架,可以更轻松地构建企业 .NET 应用程序 Lamar - 一个快速 IoC 容器,针对在 ASP.NET Core 和其他 .NET 服务器端应用程序中的使用进行了高度优化。 LightInject - 一个超轻量级的 IoC 容器 Simple Injector - Simple Injector 是一个易于使用的 .NET 4+ 依赖注入 (DI) 库,支持 Silverlight 4+、Windows Phone 8、Windows 8,包括通用应用和 Mono。 Microsoft.Extensions.DependencyInjection - ASP.NET Core 应用程序的默认 IoC 容器。 Scrutor - Microsoft.Extensions.DependencyInjection 的程序集扫描扩展。 VS MEF - Visual Studio 使用的托管可扩展性框架 (MEF) 实现。 TinyIoC - 一个易于使用、无忧无虑的控制反转容器,适用于小型项目、库和初学者等。 Stashbox - 用于基于 .NET 的解决方案的轻量级、快速且可移植的依赖注入框架。原始答案如下。
我想我在这里可能有点挑剔,但重要的是要注意 DI(依赖注入)是一种编程模式,由 IoC(控制反转)框架促进,但不需要。 IoC 框架让 DI 变得更加容易,并且它们提供了许多超越 DI 的其他好处。
话虽如此,我确定这就是您要问的。关于 IoC 框架;我曾经经常使用Spring.Net 和CastleWindsor,但真正的痛苦在于你必须编写的所有讨厌的 XML 配置!他们现在几乎都在朝着这个方向发展,所以我在过去一年左右一直在使用StructureMap,并且由于它已经使用强类型泛型和注册表转移到流利的配置中,我在使用 IoC 时遇到的痛苦障碍已经跌至零以下!现在我知道我的 IoC 配置是在编译时检查的(大部分情况下),而且我对 StructureMap 及其速度感到非常高兴,这让我感到非常兴奋。我不会说其他的在运行时速度很慢,但它们对我来说更难设置,而且挫折常常赢得了胜利。
更新
我一直在我的最新项目中使用Ninject,使用它绝对是一种乐趣。这里的话让我有点失望,但是(正如我们在英国所说)这个框架是“狗”。对于任何想要快速启动和运行的绿地项目,我强烈推荐它。我从 Justin Etheredge 的 fantastic set of Ninject screencasts 那里得到了我需要的一切。我根本看不出将 Ninject 改装到现有代码中是一个问题,但根据我的经验,StructureMap 也可以这样说。在这两者之间前进将是一个艰难的选择,但我宁愿竞争也不愿停滞不前,而且那里有相当数量的健康竞争。
也可以在here on Dimecasts 找到其他 IoC 截屏视频。
【讨论】:
很高兴看到一个高质量的、经过深思熟虑的答案出现在一个衬垫上。你说服我去看看 StructureMap。 不错,但公平地说 - 温莎现在也有一个非常漂亮的成熟流畅的界面。 您能否解释一下 IoC 框架除了易于实现 DI 之外还有哪些“其他好处”? @fearofawhackplanet IoC 容器可以做而poor man's DI 无法做到的唯一事情之一是拦截。很好的总结:kenneth-truyers.net/2013/05/16/… 我读过一些消息称 Ninject 是最慢的 palmmedia.de/blog/2011/8/30/… 和 ***.com/questions/4581791/…【参考方案2】:这取决于您在寻找什么,因为它们各有优缺点。
Spring.NET
是最成熟的,因为它来自 Java 世界的 Spring。 Spring 有一套非常丰富的框架库,可以对其进行扩展以支持 Web、Windows 等。
Castle Windsor
是 .NET 平台中使用最广泛的一种,拥有最大的生态系统,具有高度可配置/可扩展性,具有自定义生命周期管理,AOP 支持,具有固有的 NHibernate 支持并且是所有围绕真棒容器。 Windsor 是整个堆栈的一部分,其中包括 Monorail、Active Record 等。NHibernate 本身构建在 Windsor 之上。
Structure Map
通过内部 DSL 具有非常丰富和细粒度的配置。
Autofac
是新时代的 IoC 容器,具有其所有固有的函数式编程支持。它在管理生命周期方面也采取了与其他方法不同的方法。 Autofac 仍然很新,但它推动了 IoC 的可能性。
Ninject
我听说过少即是多的方法(没听说过)。
Unity
的最大区别在于:它来自微软并得到微软的支持(p&p)。 Unity 具有非常好的性能和出色的文档。它也是高度可配置的。它没有城堡/结构图的所有花里胡哨。
总之,这真的取决于什么对你来说很重要。我会同意其他人的意见,去评估和看看哪一个适合。好消息是你有很多甜甜圈可供选择,而不仅仅是果冻。
【讨论】:
Autofac 实际上并不是那么新,它比 Unity 更老 :) 我说它比 Unity 更新了吗?我说它是新时代的……我的意思是它是功能性的。好吧,我说它仍然很新,但我的意思是它的本质而不是 IT 是新的。 :-) @Krzysztof - 我发现 Unity 非常简单(至少在代码中流畅配置时)。你觉得什么痛苦? @Krzysztof - Using the UnityContainer Fluent Interface 这是一个有趣的性能基准:palmmedia.de/Blog/2011/8/30/…【参考方案3】:Autofac。 https://github.com/autofac/Autofac 真的很快,还不错。这是一个比较链接(在 Ninject 修复内存泄漏问题后制作)。
http://www.codinginstinct.com/2008/05/ioc-container-benchmark-rerevisted.html
【讨论】:
我确实喜欢 autofac,但它肯定不快。正如上面的史蒂文链接:palmmedia.de/Blog/2011/8/30/…【参考方案4】:Ninject 很棒。它似乎真的很快,但我没有做过任何比较。我知道作者 Nate 对 Ninject 和其他 DI 框架进行了一些比较,正在寻找更多方法来提高 Ninject 的速度。
我听过很多我尊敬的人对 StructureMap 和 CastleWindsor 的好评。在我看来,这些是目前值得关注的三大巨头。
【讨论】:
Ninject 很流行,但肯定不是很快。它实际上是最慢的之一:palmmedia.de/Blog/2011/8/30/…【参考方案5】:我用Simple Injector:
Simple Injector 是一个简单、灵活且快速的依赖注入库,它使用最佳实践来引导您的解决方案走向成功。
【讨论】:
当心有些人认为服务定位器是一种反模式,包括使用它一段时间甚至为它编写库的人:blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern Steven 也是 Simple Injector 的创建者......所以这是一个垃圾邮件的答案......尤其是他使用 alt 帐户这样做......虽然 Simple Injector 相当快: palmmedia.de/Blog/2011/8/30/…【参考方案6】:我是城堡的忠实粉丝。我喜欢它在 IoC Container 故事之外还提供的设施。它确实简化了 NHibernate、日志记录、AOP 等的使用。我还使用 Binsor 配置 Boo,并因此真正爱上了 Boo 作为一种语言。
【讨论】:
【参考方案7】:我花了一天的大部分时间来努力让最简单的 Spring.NET 示例正常工作,但没有成功。永远无法弄清楚如何让它从 XML 文件中找到我的程序集。另一方面,在大约 2 小时内,我能够让 Ninject 工作,包括测试与 NUnit 和 MSTest 的集成。
【讨论】:
【参考方案8】:我过去曾使用过Spring.NET,并取得了巨大的成功。尽管我们使用它的项目本身相当繁重,但我从未注意到它有任何重大开销。只需花一点时间阅读documentation 即可完成设置。
【讨论】:
【参考方案9】:我可以推荐 Ninject。它非常快速且易于使用,但前提是您不需要 XML 配置,否则您应该使用 Windsor。
【讨论】:
速度不快!它是目前最慢的 DI 框架之一! palmmedia.de/Blog/2011/8/30/… @Serj Sagan 公平地说,这些结果是古老的(现在已经 6 岁了) akshaysura.com/2016/08/31/…【参考方案10】:C# 的伟大之处在于,它正在走一条在它之前多年的 Java 开发人员所走过的道路。所以,一般来说,在寻找这种性质的工具时,我的建议是寻找可靠的 Java 答案,看看是否存在 .NET 适配。
所以说到 DI(那里有很多选择,这真的是个人喜好问题)是Spring.NET。此外,研究项目背后的人总是明智的。我没有建议将 SourceGear 产品用于源代码控制(除了使用它们),因为我尊重 Eric Sink。我看过马克波拉克的演讲,我能说什么,这家伙就明白了。
最后,有很多 DI 框架,最好的办法是用其中的一些框架做一些示例项目,然后做出明智的选择。
祝你好运!
【讨论】:
【参考方案11】:我认为 Ninject 是一个很好的起点,它是新的并且考虑了很多微调并且非常快。开发者 Nate 确实有一个很棒的网站和强大的支持。
【讨论】:
为什么说它快???它是最慢的之一! palmmedia.de/Blog/2011/8/30/…【参考方案12】:Spring.Net 相当可靠,但文档需要一些时间才能完成。 Autofac 很好,虽然支持 .Net 2.0,但您需要 VS 2008 来编译它,或者使用命令行来构建您的应用程序。
【讨论】:
以上是关于哪些 .NET 依赖注入框架值得研究? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章