我是 DI 和 IoC 的新手,我正在尝试决定要学习哪个 IoC 容器。我已经看到了几个性能比较,其中引用的三个容器似乎表现得非常好。但是,我没有发现包含 Hiro 或 Simple Injector 的功能比较。Autofac 的社区似乎是最大的,但 Hiro 和 Simple Injector 在基准测试中的速度非常快,特别是 Simple Injector 声称非常容易学习。也就是说,我不想学习一个并且不得不切换到另一个,因为功能集是有限的。出于这个原因,我倾向于 Autofac,因为它相当成熟并且功能完整(这里和这里的好文章) 并且是可用的最快的 IoC 容器之一。有没有人使用过这三个容器中的至少两个?你能提供任何功能比较吗?
1 回答
首先让我说我是Simple Injector背后的首席开发人员。
我同意Mark的观点,在大多数情况下,容器的性能不是问题。尽管如此,某些容器在某些方面的性能非常差,并且很难从性能的角度直观地感知配置的哪些部分可能会出现问题。无论您使用哪个容器,大多数性能问题都可以通过更改配置(将注册更改为单例、添加缓存等)来解决。然而,此时配置容器会变得非常复杂。我们试图用 Simple Injector 解决这种复杂性。我喜欢让其他人来决定我们是否成功(或者是否拥有一个 DI 容器,或者另一个DI 容器是否有用)。
然而,当我开始项目时,性能在我的初始列表中甚至没有那么高(简单性),但是(无锁和Expression
基于树的)设计允许我进行优化,使其成为该领域中最快的容器之一(同时仍然非常丰富且可扩展)。在大多数情况下,您会发现性能非常接近于手动更新实例。
这就是说,学习依赖注入作为一种模式仍然需要更多的时间,而不是学习使用特定的 DI 容器(Mark 的书对这两者都有帮助)。容器——甚至是简单的注入器——不会帮助你理解 DI 和SOLID(然而,它的一些限制试图推动你拥有一个干净的应用程序设计)。
Simple Injector 在 DI 场景中是相当新的(或迟到的)。正因为如此,它与其他框架之间没有太多的比较(尽管有一些here和here),并且与其他框架相比,用户数量有限但迅速增加(根据Roy Osherove 的一项旧民意调查,Simple Injector 有当时的市场份额约为 4%)。很遗憾,Simple Injector 没有进行很多比较,因为它有很多功能(例如,请查看文档中的高级场景部分)。您在(第 1部分和第 2部分)链接的比较中缺少简单的注射器),所以这里是 Simple Injector 的功能列表(但请注意,Simple Injector 已添加到作者的较新比较之一):
- 框架:简单注入器
- 版本:3.0
- 执照:麻省理工学院
- 最小 dll : 1
- 大小:342 KB
- 流利:不需要,只有程序化
- 自动注册: 包括
- 属性用法:不包括(但可能通过扩展)
- XML 用法:不支持
- 属性注入:是(选择加入)。
- 构造函数注入:是
- 多个构造函数:不包括在内,但可扩展
- 递归依赖:有意义的错误
- 单身人士:是的
- 瞬态:是的
- 其他/自定义:是的,可插拔
- 自定义实例:支持
- 开放泛型:包括
- 未注册类型解析:是
- 自动模拟:不包括在内,但可扩展。
- 特殊功能:诊断服务、注册泛型类型的装饰器、部分开放的泛型、条件/上下文注册和性能。有用于生活方式的 NuGet 扩展包,例如Web Request和Lifetime Scoping。基于
Expression
API 允许添加对几乎任何高级场景的支持,例如拦截(尽管提倡使用装饰器)。
我不知道您的要求是什么,但我敢打赌 Simple Injector 可以在您的项目的整个生命周期内为您服务。如果您遇到问题,请在 Stackoverflow.com 或Simple Injector 论坛上询问。Simple Injector 贡献者和其他爱好者将很乐意为您提供帮助。不要忘记,有很多Stackoverflow 用户可以帮助您解决一般 DI 问题。