哪些C#/ .NET依赖注入框架值得研究? 你能说出他们的复杂性和速度。

===============>>#1 票数:328 已采纳

编辑 (不是作者):有一个完整的IoC框架列表,可在https://github.com/quozd/awesome-dotnet/blob/master/README.md#ioc获得

  • 温莎城堡 - 温莎城堡是最好的,成熟的反转控制容器可用于.NET和Silverlight
  • Unity - 轻量级可扩展依赖注入容器,支持构造函数,属性和方法调用注入
  • Autofac - 令人上瘾的.NET IoC容器
  • DryIoc - 简单,快速的全功能IoC容器。
  • Ninject - .NET依赖注入器的忍者
  • StructureMap - .Net的原始IoC / DI容器
  • Spring.Net - Spring.NET是一个开源应用程序框架,它使构建企业.NET应用程序变得更容易
  • LightInject - 超轻量级IoC容器
  • Simple Injector - Simple Injector是一个易于使用的.NET 4+依赖注入(DI)库,支持Silverlight 4 +,Windows Phone 8,Windows 8,包括Universal应用程序和Mono。
  • Microsoft.Extensions.DependencyInjection - ASP.NET Core应用程序的默认IoC容器。
  • Scrutor - Microsoft.Extensions.DependencyInjection的程序集扫描扩展。
  • VS MEF - Visual Studio使用的托管扩展性框架(MEF)实现。
  • TinyIoC - 易于使用,轻松自如,反转控制容器,适用于小型项目,图书馆和初学者。

原始答案如下。


我想我可能在这里有点挑剔,但重要的是要注意DI(依赖注入)是一种编程模式,并且由IoC(控制反转)框架促进,但不需要。 IoC框架使DI变得更容易,并且它们提供了除DI之外的许多其他好处。

话虽如此,我确信这就是你所要求的。 关于IoC框架; 我以前经常使用Spring.NetCastleWindsor ,但背后真正的痛苦就是你必须写的那个讨厌的XML配置! 它们现在几乎都是这样移动的,所以我在过去一年左右一直在使用StructureMap ,并且由于它已经使用强类型泛型和注册表转移到流畅的配置,我在使用IoC时的痛苦障碍已经降到零下! 现在知道我的IoC配置在编译时被检查(大部分时间),我得到了一个绝对的机会,我对StructureMap及其速度感到高兴。 我不会说其他人在运行时速度很慢,但是对我来说设置起来比较困难,而且经常赢得挫败感。

更新

我一直在使用Ninject进行我的最新项目,并且使用起来非常愉快。 单词在这里让我失望,但(正如我们在英国所说)这个框架是“狗”。 我强烈建议您在任何想要快速启动和运行的绿色领域项目中使用它。 我从Justin Etheredge的一套精彩的Ninject截屏中得到了我所需要的一切。 我看不出将Ninject改编成现有代码根本就是一个问题,但在我的经验中可以说StructureMap也是如此。 在这两者之间展开将是一个艰难的选择,但我宁愿竞争而不是停滞不前,那里有相当数量的健康竞争。

其他IoC截屏也可以在Dimecasts上找到

===============>>#2 票数:77

这取决于你在寻找什么,因为它们各有利弊。

  1. Spring.NET是最成熟的,因为它来自Java世界的Spring。 Spring有一组非常丰富的框架库,可以扩展它以支持Web,Windows等。
  2. Castle Windsor是.NET平台中使用最广泛的一个,拥有最大的生态系统,高度可配置/可扩展,具有自定义生命周期管理,AOP支持,具有固有的NHibernate支持,并且是一个非常棒的容器。 Windsor是整个堆栈的一部分,包括Monorail,Active Record等.NHibernate本身建立在Windsor之上。
  3. Structure Map通过内部DSL具有非常丰富和细粒度的配置。
  4. Autofac是新时代的IoC容器,具有所有固有的功能编程支持。 管理生命周期的方法也不同于其他方法。 Autofac仍然是非常新的,但它推动了IoC的可能性。
  5. Ninject我听说过更多的裸露骨头,更少的方法(听说没有经验)。
  6. Unity的最大鉴别者是:它来自微软(p&p)并得到其支持。 Unity具有非常好的性能和出色的文档。 它也是高度可配置的。 它没有说城堡/结构地图的所有花里胡哨的东西。

总而言之,它实际上取决于对您来说重要的事情。 我会同意其他人一起去评估和看哪一个适合。 好的是你有一个很好的甜甜圈选择,而不是只需要一个果冻。

===============>>#3 票数:35

Autofac。 https://github.com/autofac/Autofac这真的很快,非常好。 这是一个比较链接(在Ninject修复内存泄漏问题后制作)。

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

===============>>#4 票数:18

Ninject很棒。 它看起来真的很快,但我还没有做过任何比较。 我知道作者Nate在Ninject和其他DI框架之间进行了一些比较,并且正在寻找更多方法来提高Ninject的速度。

我听说很多我尊敬的人都对StructureMap和CastleWindsor说了些好话。 在我看来,这些是现在看到的三巨头。

===============>>#5 票数:13

我使用Simple Injector

Simple Injector是一个简单,灵活,快速的依赖注入库,它使用最佳实践指导您的解决方案走向成功的关键。

===============>>#6 票数:8

我是Castle的忠实粉丝。 我喜欢它在IoC Container故事之外提供的设施。 它真的很简单,使用NHibernate,日志记录,AOP等。我也使用Binsor配置Boo并且因为它而真的爱上了Boo作为一种语言。

===============>>#7 票数:5

我可以推荐Ninject。 它非常快速且易于使用,但只有在您不需要XML配置时,否则您应该使用Windsor。

===============>>#8 票数:5

我花了一天的时间在没有成功的情况下努力让最简单的Spring.NET示例正常工作。 永远无法弄清楚如何从XML文件中找到我的程序集。 另一方面,在大约2个小时内,我能够让Ninject工作,包括测试与NUnit和MSTest的集成。

===============>>#9 票数:4

我过去使用过Spring.NET ,并且取得了很大的成功。 我从来没有注意到它有任何实质性的开销,尽管我们使用它的项目本身相当沉重。 只需花一点时间阅读文档即可完成设置。

===============>>#10 票数:2

Spring.Net非常可靠,但文档需要花费一些时间才能完成。 Autofac很好,虽然支持.Net 2.0,但您需要VS 2008来编译它,否则使用命令行来构建您的应用程序。

===============>>#11 票数:2

关于C#的好处在于,它遵循的是多年前Java开发人员击败的路径。 所以,我的建议,一般来说,在寻找这种性质的工具时,就是寻找可靠的Java答案,看看是否存在.NET改编。

因此,当谈到DI(并且有很多选择,这真的是一个品味问题)是Spring.NET 此外,研究项目背后的人总是明智的。 我没有建议SourceGear产品用于源代码控制(使用它们之外),因为我尊重Eric Sink。 我见过马克波拉克说话,我能说些什么,这家伙才能得到它。

最后,有很多DI框架,你最好的选择是做一些示例项目,并做一些有根据的选择。

祝好运!

===============>>#12 票数:2

我认为一个好的起点是Ninject,它是新的并且已经考虑了很多微调并且非常快。 Nate,开发人员,真的有一个很棒的网站和很大的支持。

  ask by pbreault translate from so

未解决问题?本站智能推荐:

6回复

.NET框架中的控制和依赖注入反转

在.NET Framework本身中,是否有任何将DI用作架构原理或设计模式的特定示例/实例? 框架/ BCL中的任何(或许多)类型是否符合IoC? 类型名称和基于C#的简短插图/说明都很棒! 最好将DI注入设计原则作为最佳实践……因为它是从基础框架本身收集而来的。 我重申,
1回复

依赖注入框架配置文件放在哪里?

我有一个包含几个不同项目的解决方案,其中一些是纯类库,一些是Web应用程序项目。 如果我希望所有项目都可以使用默认类型,那么应该在哪里放置容器的配置文件?
3回复

.Net中的依赖注入没有虚拟方法调用?

我一直在考虑是否可以应用DI模式而不会产生虚拟方法调用的成本(根据实验,我做的可能比非虚拟调用慢4倍)。 我的第一个想法是通过泛型进行依赖注入: 不幸的是,即使TComponentB和TComponentC的具体实现被指定为泛型类型参数并且所有类都被声明为sealed,CLR仍然通过接
1回复

Autofac依赖注入实现

我开始研究一个新项目,我来自一个直接的,“天真”的编程。 现在我关心使用IoC容器,特别是使用Autofac的依赖注入模式。 假设我有一个简单的会话工厂: 在Bootstrap.cs中,我像这样配置autofac: 我的问题是: 如何使用Autofac将Se
1回复

注入依赖关系 - 更简单的方法?

这是我在Windstor Castle DI / IOC中的Installer类。 我正在寻找一种非常简单的方式来宣告类似的东西 container.Register(Values1Controller, IServiceRequest, ServiceRequest); co
4回复

依赖注入 - 如果依赖生命周期比依赖对象短,该怎么办?

我意识到DI是一种非常灵活的设计模式,尽管我很难接受它作为创建解耦代码的“银弹”。 原因如下:当依赖对象的生命周期长于它注入的依赖项时会发生什么? 示例应用程序:我有一个BusinessLogic类,它在我的应用程序的生命周期中实例化。 此类需要DataContext对象来执行数据
2回复

方法注入(DI,.NET,IOC)

我正在使用.NET(MVC5,Web API等)。 我几乎了解构造函数注入(对于在愤怒中使用它非常陌生)。 我有一类具有依赖项的方法。 我不想使用构造函数注入,因为那样的话,每次实例化此类时,我都会创建依赖对象(而且大多数方法都不使用此依赖对象)。 因此,我认为方法注入听起来可能是事实。
4回复

如何使用依赖注入多次创建对象

我正在使用C#.Net,但是任何相关示例都是可以接受的。 我有2个winform,例如ListFrm和DetailFrm,其中每次用户单击DetailFrm中的按钮时,都会弹出一个新的ListFrm,以便用户可以更改所选项目。 DetailFrm.cs ListFrm.cs
1回复

C#依赖注入强制转换问题

我有几个实现相同接口的类。 在我的业务经理班里,我有: 在BusinessManager中,我调用了一个函数来更改_bidLogicManager(MyType是一个枚举) IEntity是一个空白接口,可与t4和Entity框架生成的POCO类一起使用。 我本可以
2回复

Munq属性注入可选的依赖项

我正在考虑尝试使用Munq来执行可选依赖项的属性注入。 如果没有在注入的课程中做这样的事情,这可能吗?: 另外,在这种情况下使用属性注入(可选的依赖项)还是有更好的选择?