哪些 C#/.NET 依赖注入框架值得研究?关于它们的复杂性和速度,你能说什么。
12 回答
编辑(不是作者):在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的一组精彩的 Ninject 截屏视频中得到了我需要的一切。我根本看不出将 Ninject 改装到现有代码中是一个问题,但根据我的经验, StructureMap也可以这样说。在这两者之间前进将是一个艰难的选择,但我宁愿竞争也不愿停滞不前,而且那里有相当数量的健康竞争。
其他 IoC 截屏视频也可以在 Dimecasts 上找到。
这取决于您在寻找什么,因为它们各有优缺点。
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 具有非常好的性能和出色的文档。它也是高度可配置的。它没有城堡/结构图的所有花里胡哨。
所以总而言之,这真的取决于对你来说什么是重要的。我会同意其他人的意见,去评估和看看哪一个适合。好消息是你有一个很好的甜甜圈选择,而不仅仅是一个果冻。
自动法。 https://github.com/autofac/Autofac真的很快,也不错。这是一个比较链接(在 Ninject 修复内存泄漏问题后制作)。
http://www.codinginstinct.com/2008/05/ioc-container-benchmark-rerevisted.html
宁杰很棒。它似乎真的很快,但我没有做过任何比较。我知道作者 Nate 对 Ninject 和其他 DI 框架进行了一些比较,正在寻找更多提高 Ninject 速度的方法。
我听说很多我尊敬的人都对 StructureMap 和 CastleWindsor 说好话。在我看来,这些是现在要看的三巨头。
我使用简单的注射器:
Simple Injector 是一个简单、灵活和快速的依赖注入库,它使用最佳实践来引导您的解决方案走向成功的坑。
我是城堡的忠实粉丝。我喜欢它在 IoC Container 故事之外还提供的设施。它确实简化了 NHibernate、日志记录、AOP 等的使用。我还使用Binsor来配置 Boo,并且因为它而真正爱上了 Boo 作为一种语言。
我花了一天的大部分时间都在努力使最简单的 Spring.NET 示例正常工作,但没有成功。永远无法弄清楚如何让它从 XML 文件中找到我的程序集。另一方面,在大约 2 小时内,我能够让 Ninject 工作,包括测试与 NUnit 和 MSTest 的集成。
我过去使用过Spring.NET,并取得了巨大的成功。尽管我们使用它的项目本身相当繁重,但我从未注意到它有任何重大开销。只需花一点时间阅读文档即可进行设置。
我可以推荐 Ninject。它非常快速且易于使用,但前提是您不需要 XML 配置,否则您应该使用 Windsor。
C# 的伟大之处在于,它走的是在它之前多年的 Java 开发人员所走过的道路。所以,一般来说,在寻找这种性质的工具时,我的建议是寻找可靠的 Java 答案,看看是否存在 .NET 适配。
因此,当谈到 DI(那里有很多选择,这真的是一个口味问题)是Spring.NET。此外,研究项目背后的人总是明智的。我没有建议将 SourceGear 产品用于源代码控制(除了使用它们),因为我尊重 Eric Sink。我看过马克波拉克讲话,我能说什么,这家伙就明白了。
最后,有很多 DI 框架,最好的办法是用其中的一些做一些示例项目,并做出明智的选择。
祝你好运!
我认为 Ninject 是一个很好的起点,它是新的并且考虑了很多微调并且非常快。Nate,开发者,真的有一个很棒的网站和强大的支持。
Spring.Net 相当可靠,但文档需要一些时间才能完成。Autofac 很好,虽然支持 .Net 2.0,但您需要 VS 2008 来编译它,或者使用命令行来构建您的应用程序。