我正在考虑在用户界面中使用 Microsoft Unity 作为我的依赖注入工具。

我们的中间层已经使用 Castle Windsor,但我认为我应该坚持使用 Microsoft。

有人对最好的依赖注入工具是什么有什么想法吗?

有帮助吗?

解决方案

如果您的系统在设计时考虑了 IoC/DI,那么坚持使用一个容器并不重要。通过正确的方法,您可以轻松地更改 IoC 库。

当然,容器必须提供足够的灵活性来支持常见的广泛使用的场景(生命周期管理、适当的容器嵌套、XML 和代码配置、拦截、快速解析)。

我建议在 Castle(广泛使用并且有很多集成库)和 Autofac(轻量级、快速并且具有适当的容器嵌套,但没有广泛使用)之间进行选择

有一个 IoC 容器的综合列表 通过汉塞尔曼

附:你不想使用Unity

其他提示

最近增加了其中 6 个的使用(温莎, 统一, 春网, 奥特法, 忍者, 结构图)我可以快速总结一下我们的选择标准和最终选择。

笔记:我们没有考虑 PicoContainer.Net,因为我们的团队之一认为 .Net 端口与 Java 版本相比相当差。我们也没有考虑 ObjectBuilder,因为 Unity 是构建在 ObjectBuilder2 之上的,并且默认情况下被认为是更好的选择。

首先,我可以说它们或多或少都非常相似,这实际上取决于什么最适合您以及您的具体要求。我们的要求包括:

要求

  • 基于构造函数的注入(我们打算 不是 使用属性、字段或方法注入)
  • 可编程配置(不是 XML)
  • 容器层次结构(每个应用程序、每个请求和每个会话一个,以更隐式地将组件生命周期范围绑定到容器)
  • 组件生命周期管理(用于更细粒度的范围,例如瞬态/单例)
  • 从接口注入到类型或具体实例(例如 ILogger -> typeof(FileLogger) 或者 ILogger -> new FileLogger() )
  • 用于预/后初始化的高级组件创建/“creaton 事件机制”
  • 正确处置 IDisposable 容器上的组件拆卸
  • 有据可查和/或在线信息随时可用

    笔记:虽然性能是一项要求,但在选择时并未考虑到这一点,因为根据此标准,所有经过审查的容器似乎都是相似的 基准

测试

每个容器都用于典型的 Asp.Net Webforms 项目(因为这是我们的目标应用程序类型)。我们使用单个简单页面和单个简单用户控件,每个控件分别继承自基本页面/基本控件。我们用了 1 个容器 BasePage 对于“每个请求”范围容器和 global.asax 上的 1 用于“应用程序”范围,并尝试将它们链接在一起,以便可以从两个容器解析依赖关系。

每个 Web 应用程序共享一组设计的域对象,模拟多级依赖关系、范围类型(​​单例/瞬态)以及托管和非托管类(IDisposable 必需的)。“顶级”依赖组件是从方法手动注入的 BasePage.

结果

温莎 - 满足所有标准,并拥有良好的案例历史、博客社区和在线文档。易于使用,可能是事实上的选择。通过工厂设施进行高级组件创建。还允许链接单独创建的容器。

Spring.Net - 冗长且无用的文档以及不明显/易于编程的配置。不支持泛型。未选择

Ninject - 易于使用,文档清晰。强大的功能集满足我们除容器层次结构之外的所有要求,因此不幸的是没有被选择。

StructureMap - 文档记录很差,尽管有相当高级的功能集可以满足我们的所有要求,但是没有用于容器层次结构的内置机制,尽管可以使用 for 循环将其组合在一起,请参阅 这里 lambda 表达式流式接口乍一看确实有点过于复杂,尽管可以封装掉。

Unity - 文档齐全,易于使用,满足我们所有的选择标准,并且具有简单的扩展机制来添加我们所需的创建前/创建后事件机制。子容器必须从父容器创建。

Autofac - 文档齐全且相对易于使用,尽管 lambda 表达式配置看起来确实有点过于复杂,但同样可以轻松封装掉。组件范围是通过“标记”机制实现的,所有组件都是使用构建器预先配置的,这有点不方便。子容器是从父容器创建的,并从“标签”分配组件。允许通用注入。

结论

我们最终的选择是在 Windsor 和 Unity 之间,而这一次我们选择 Unity 是因为它的易用性、文档、扩展系统以及它处于“生产”状态。

我开始使用 奥特法 一年前,从那以后就没有回头过。

我是 Autofac 的粉丝,但 Windsor 和 Unity 都会做得很好(尽管 Windsor 比 unity 更强大,并且不需要归属您的代码)。不过,在系统中坚持使用单个容器有很多好的非技术原因。

使用有效的方法。大多数都有其独特的功能,而且几乎所有功能都比 Unity 更丰富。如果您只需要统一,那么您当然可以使用它。

仅仅因为 Microsoft 的统一来自 Microsoft,就使用它是一个糟糕的决策方式。考虑一下您需要什么以及为什么,然后选择适合您需要的一种。

不过,我赞同如果可能的话坚持使用单个容器的想法。

我一直在使用 托管可扩展性框架 并发现它很容易使用。它已经 集成到.NET 4中.

除非您已经有经验并且对可能的 IoC 容器解决方案之一所使用的特定子技术有个人偏好,否则它们都运行良好,而且我没有看到任何一个特别具有使其脱颖而出的“杀手级功能”来自其他人。Unity 可能最适合已使用 P&P Enterprise Library 4.x 的解决方案...

IoC 容器基准 - 性能比较 拥有 20 多种产品的性能和功能比较表,并使其保持最新状态。

文章的结论:

简单注射器,Hiro,Funq,Munq和Dynamo提供了最佳性能,它们非常快。尝试一下吧!

尤其 简易注射器 似乎是一个不错的选择。它非常快,文档很好,还支持诸如拦截和通用装饰器之类的高级场景。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top