在 .NET 的同一解决方案中使用两个 IoC 容器的缺点?
Downsides of using two IoC containers in same solution in .NET?
我正在开发一个项目,该项目使用来自其他开发人员的一组库,这些库使用 structuremap 作为 IoC 容器。 [我有代码库]
我们合并这些库的应用程序使用 unity container。
在同一个解决方案中使用两个容器框架有什么缺点吗?我想将所有内容都移到同一个 IoC 容器中,但如何证明额外的努力是合理的?
在同一个 解决方案 和同一个 应用程序 中有多个容器库是有区别的,因为一个解决方案可以包括多个可运行的应用程序。
所有组件都应连接到应用程序的启动路径中,a.k.a。 Composition Root:
A Composition Root is a (preferably) unique location in an application where modules are composed together.
结合使用构造函数注入,复合根模式使您的应用程序完全松散耦合,并使您的应用程序代码与 DI 容器分离。
根据组合根模式,应用程序的任何其他部分都不应依赖于 DI 容器。事实上,您使用的库确实存在问题,因为这会迫使您进入某个 DI 容器。更好的解决方案是使库 DI-friendly.
在同一个解决方案中使用多个容器库有一些缺点:
- 您必须学习两个不同的 DI 容器库,每个库都有其局限性和怪癖
- 每个库都有自己的风险,需要在 development stops 时更换。
最重要的是,在同一个 应用程序 中使用多个容器库有一些缺点:
- 当单个对象图由来自不同容器的应用程序组件构成时,可能会出现复杂性。很难可视化对象图并验证它们的正确性。
- 如果某些组件从两个容器中解析出来,可能会导致 Torn Lifestyles
这并不是说您绝不能在同一个解决方案或应用程序中使用多个容器。例如,您可以使用两个容器作为临时解决方案,因为您要从一个库迁移到另一个库,但一次大爆炸式迁移工作量太大。理想情况下,在这种情况下,您会一次迁移一个应用程序,但即便如此,一次也可能无法完成。
另一种可以使用两个容器的常见情况是,当您使用的应用程序框架 运行 在内部使用 DI 容器来构建其服务时。这些框架的常见示例是 ASP.NET Core 和 NServiceBus。在这种情况下,为了明确区分,我通常会谈论框架的 配置系统 而不是它的内部容器,因为它基本上就是这样。它是一个容器,是一个实现细节。
在这种情况下,您可以保留内置 'configuration system' 原样来解析 框架组件 ,并使用您选择的 DI 容器构建对象图应用组件.
我正在开发一个项目,该项目使用来自其他开发人员的一组库,这些库使用 structuremap 作为 IoC 容器。 [我有代码库]
我们合并这些库的应用程序使用 unity container。
在同一个解决方案中使用两个容器框架有什么缺点吗?我想将所有内容都移到同一个 IoC 容器中,但如何证明额外的努力是合理的?
在同一个 解决方案 和同一个 应用程序 中有多个容器库是有区别的,因为一个解决方案可以包括多个可运行的应用程序。
所有组件都应连接到应用程序的启动路径中,a.k.a。 Composition Root:
A Composition Root is a (preferably) unique location in an application where modules are composed together.
结合使用构造函数注入,复合根模式使您的应用程序完全松散耦合,并使您的应用程序代码与 DI 容器分离。
根据组合根模式,应用程序的任何其他部分都不应依赖于 DI 容器。事实上,您使用的库确实存在问题,因为这会迫使您进入某个 DI 容器。更好的解决方案是使库 DI-friendly.
在同一个解决方案中使用多个容器库有一些缺点:
- 您必须学习两个不同的 DI 容器库,每个库都有其局限性和怪癖
- 每个库都有自己的风险,需要在 development stops 时更换。
最重要的是,在同一个 应用程序 中使用多个容器库有一些缺点:
- 当单个对象图由来自不同容器的应用程序组件构成时,可能会出现复杂性。很难可视化对象图并验证它们的正确性。
- 如果某些组件从两个容器中解析出来,可能会导致 Torn Lifestyles
这并不是说您绝不能在同一个解决方案或应用程序中使用多个容器。例如,您可以使用两个容器作为临时解决方案,因为您要从一个库迁移到另一个库,但一次大爆炸式迁移工作量太大。理想情况下,在这种情况下,您会一次迁移一个应用程序,但即便如此,一次也可能无法完成。
另一种可以使用两个容器的常见情况是,当您使用的应用程序框架 运行 在内部使用 DI 容器来构建其服务时。这些框架的常见示例是 ASP.NET Core 和 NServiceBus。在这种情况下,为了明确区分,我通常会谈论框架的 配置系统 而不是它的内部容器,因为它基本上就是这样。它是一个容器,是一个实现细节。
在这种情况下,您可以保留内置 'configuration system' 原样来解析 框架组件 ,并使用您选择的 DI 容器构建对象图应用组件.