Simple Injector与Hiro与Autofac比较

46

我对DI和IoC还不熟悉,正在尝试决定要学习哪个IoC容器。我看过几个性能比较,其中三个容器表现得非常好。但是,我没有找到包括Hiro或Simple Injector的功能比较。Autofac的社区似乎是最大的,但Hiro和Simple Injector在基准测试中速度非常快,而Simple Injector特别声称很容易学习。话虽如此,我不想学习一个容器,然后因为功能集有限而不得不切换到另一个容器。出于这个原因,我倾向于选择Autofac,因为它相当成熟且功能完备(好文章这里这里),同时也是可用的最快的IoC容器之一。有没有人至少使用过这三个容器中的两个?可以提供任何功能比较吗?


27
DI容器的性能大多无关紧要,除非你开发的应用程序与正在.NET上编写的99%应用程序大不相同,否则你的性能瓶颈将在其他地方(I/O)。这里可以找到功能比较:https://dev59.com/t2455IYBdhLWcg3wAvbQ#4583809 - Mark Seemann
1
我不知道你所定义的“一致好用的东西”是什么,但就我个人而言,StructureMap 是我最喜欢的容器,因为它非常实用,内置了一些其他容器没有的好东西,但它并不臃肿,而且非常快速。Ninject 很好用,因为它具有出色的插件/nuget 支持。正如 @Mark Seemann 所说,性能不是评判一个容器的正确方式。 - Brook
1
@MarkSeemann 在提问这个问题之前,我已经找到了那个问题。我认为你的比较图表很棒,但是它缺少了Hiro和Simple Injector。正如我在这个问题中所说,很难找到包括Hiro和/或Simple Injector的功能比较,而你引用的那个问题也不例外。对于那个问题,唯一发布的比较是基准测试,而不是功能。考虑到你写了一本关于这个主题的书,你似乎对这个主题非常熟悉。能否详细说明一下? - joelmdev
2
@Brook 虽然我很想听听人们对他们最喜欢的IoC容器的看法,但这不是SO的格式,也不是我提出的问题。如果我问了这个问题,它已经被关闭了。我只想从使用过其中至少两个容器的人那里得到这三个容器的功能比较。这使我保持在此网站定义为好问题的范围内 ;) - joelmdev
4
上次我看Hiro的时候,我的印象是它主要是一个概念验证,证明你可以制作一个合成引擎,其速度与手动创建对象一样快。除了非常快之外,它几乎没有任何“功能”。至于Simple Injector,我没有意见... - Mark Seemann
显示剩余12条评论
1个回答

100
让我先说一下,我是Simple Injector的首席开发人员。
我同意Mark的观点,在大多数情况下容器的性能不是问题。然而,有些容器在某些方面表现非常差,很难从性能角度直观地感知哪些配置可能存在问题。无论使用哪种容器,大多数性能问题都可以通过更改配置(将注册更改为单例、添加缓存等)来解决。但此时配置容器可能会变得非常复杂。我们试图用Simple Injector解决这个复杂性问题。我喜欢让其他人决定我们是否成功了(或者是否having一个DI容器,或者说另一个 DI容器甚至有用)。
然而,当我开始这个项目时,性能甚至不在我的初始列表中(简单性是),但(无锁和基于Expression树的)设计使我能够进行优化,使其成为领域内the fastest container之一(同时仍然非常功能丰富和可扩展)。在大多数情况下,您会发现性能非常接近手动实例化。
这意味着,学习依赖注入作为一种模式需要更多的时间,而学习使用特定的DI容器所需的时间比较短(Mark的书可以帮助你两者都掌握)。即使是Simple Injector这样的容器也无法帮助你理解DI和SOLID(但它的一些限制试图推动你拥有一个清晰的应用程序设计)。
Simple Injector是依赖注入领域中相对较新(或较晚)的框架。因此,与其他框架相比,它还没有太多的比较(尽管有一些这里这里),用户数量相对较少,但正在快速增长(根据Roy Osherove的旧调查,当时Simple Injector的市场份额约为4%)。遗憾的是,Simple Injector没有被广泛比较,因为它具有很强的能力(只需查看文档中的高级场景部分即可了解)。Simple Injector在您提供的比较中(part 1part 2)缺失,因此这里列出了Simple Injector的功能列表(但请注意,Simple Injector已被添加到作者的新比较之一)。 我不知道您的需求是什么,但我敢肯定 Simple Injector 可以为您的项目服务一生。如果您遇到问题,请在 Stackoverflow.com 或 Simple Injector 论坛 上提问。Simple Injector 的贡献者和其他爱好者将乐意帮助您。不要忘记还有一群 Stackoverflow 用户可以帮助您解决通用的依赖注入问题。

2
@gligoran:我指的是SOLID设计原则(我忘记包含链接了)。在任何相当规模的软件中应用SOLID原则都是至关重要的,特别是在可维护性成为问题的情况下。 - Steven
什么是自动模拟:未包含? - Ray
2
自从2.4版本以来,Simple Injector为Web API提供了支持包。文档在这里,NuGet包在这里 - Steven
1
太棒了!这个项目看起来很不错,我期待着试用它。谢谢! - swestner
1
@Steven 只是提醒一下,你在回答中的 SOLID 链接链接回了这个页面。我想你的意思是要链接到维基百科。 - JHizzal
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接