在 .NET 的同一解决方案中使用两个 IoC 容器的缺点?

2024-06-18

我正在开发一个项目,该项目使用来自其他开发人员的一组库,该库使用结构图 http://structuremap.github.io作为 IoC 容器。 [我有代码库]

我们合并这些库的应用程序使用统一容器 https://learn.microsoft.com/en-us/previous-versions/msp-n-p/ff647202(v=pandp.10).

在同一个解决方案中使用两个容器框架有缺点吗?我想将所有内容移至同一个 IoC 容器,但如何证明额外工作的合理性?


在同一个容器中拥有多个容器库是有区别的solution与相同应用,因为一个解决方案可以由多个可运行的应用程序组成。

所有组件都应连接到应用程序的启动路径中,即成分根 https://freecontent.manning.com/dependency-injection-in-net-2nd-edition-understanding-the-composition-root/:

组合根是应用程序中模块组合在一起的(最好)唯一位置。

与构造函数注入一起使用,组合根模式使您的应用程序保持完整松耦合,并使您的应用程序代码与 DI 容器分离。

根据组合根模式,应用程序的任何其他部分都不应该依赖于 DI 容器。事实上,您使用的库确实存在问题,因为这会迫使您进入某个 DI 容器。更好的解决方案是让库DI 友好 https://blog.ploeh.dk/2014/05/19/di-friendly-library/.

在同一个容器中拥有多个容器库有一些缺点solution:

  • 您必须学习两个不同的 DI 容器库,每个库都有其局限性和怪癖
  • 每个库都有其自身的风险,需要在以下情况下进行更换:发展 https://jeremydmiller.com/2018/01/29/sunsetting-structuremap/ stops https://blogs.msdn.microsoft.com/dotnet/2015/08/21/the-future-of-unity/.

最重要的是,在同一个容器中使用多个容器库有一些缺点应用:

  • 当单个对象图由来自不同容器的应用程序组件构建时,可能会出现复杂性。可视化对象图并验证它们的正确性可能很困难。
  • 如果某个组件从两个容器中解析,则可能会导致撕裂的生活方式 https://simpleinjector.org/diatl

这并不是说您永远不应该在同一个解决方案或应用程序中拥有多个容器。例如,您可以使用两个容器作为临时解决方案,因为您要从一个库迁移到下一个库,但大爆炸式迁移的工作量太大。理想情况下,在这种情况下,您可以一次迁移一个应用程序,但即使如此,也可能会难以一次性完成。

拥有两个容器就可以的另一个常见场景是,您正在运行的应用程序框架在内部使用 DI 容器来构建其服务。这些框架的常见示例是 ASP.NET Core 和 NServiceBus。在这种情况下,为了清楚地区分,我通常会谈论框架的配置系统而不是它的内部容器,因为这就是它的本质。它是一个容器,是一个实施细节.

在这种情况下,您可以按原样保留内置“配置系统”来解决框架组件,并使用您选择的 DI 容器来构建对象图应用程序组件.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 .NET 的同一解决方案中使用两个 IoC 容器的缺点? 的相关文章

随机推荐

  • 当结构体中的指针指向结构体本身时,C 如何解决循环定义?

    我已经习惯了像下面这样的代码很长一段时间 但是C编译器如何解决循环定义问题呢 或者这个问题真的存在吗 struct node int data struct node next circular definition for struct
  • 二元表达式树 C++

    我有一个小问题 我正在尝试向二叉树添加数学表达式 但我无法理解该算法 这里是 If the current token is a Add a new node as the left child of the current node an
  • 如何在 Spring 中从 application.properties 重新加载 @Value 属性? [复制]

    这个问题在这里已经有答案了 我有一个spring boot应用 在run文件夹下 有一个额外的配置文件 dir config application properties 当应用程序启动时 它使用文件中的值并将它们注入到 Value my
  • jQuery Mobile:$(...).listview 不是函数

    我正在尝试在 UL 中动态插入 LI 元素后刷新 jQuery Mobile 中的列表视图 每当我尝试 myUL listview refresh 在控制台上我收到错误 未捕获的类型错误 listview 不是函数 我该如何解决这个问题 确
  • R闪亮数据表在开始时不显示记录(行)

    我正在构建一个带有数据表的闪亮应用程序 我想要的是启动时不显示任何记录 行 这样您只能看到表格顶部的过滤器 当您开始输入时 会显示行 我在数据表中找不到选项 这可能吗 下面是示例代码 shinyApp ui navbarPage title
  • 有没有办法拥有租户特定的 JWT 令牌

    我目前正在开发一个 SPA 应用程序 角度 后端使用 Python Flask API 该应用程序将支持多个租户 我对安全概念有点挣扎 我目前正在使用 jwt extend 颁发的 JWT 令牌对所有租户都有效 我当然可以从令牌中获取用户
  • 如何在 MySQL 中求和时间?

    正如您在图片中看到的 我有一份停机报告 显示了所选工厂在选定日期的停机时间 现在我想添加所有的值 Time Duration 列并将其显示在附近的单独显示中 TOTAL TIME DURATION 例如 在图像中 所选日期为 2015 年
  • IE Facebook 应用程序 iFrame 上的会话丢失

    当用户使用 Internet Explorer 时 我的 Facebook 应用程序出现问题 我的应用程序作为 Canvas 页面加载到 iFrame 中 回发后 Cookie 和 Session 将丢失 Firefox 根本不会发生这种情
  • 如何序列化为日期时间

    努力获取任何时区的日期时间 我使用 DateTimeOffset 字符串和 XmlElement 属性 当我这样做时 我收到以下错误 InvalidOperationException 日期时间 是一个无效值 XmlElementAttri
  • cxf 解组错误:意外元素

    我正在尝试使用 SOAP 服务 使用 maven cxf codegen plugin 生成存根 大多数服务一切都很好 除了一个丑陋的服务 在这种情况下 当调用时 服务会发送正确的响应 但我生成的存根无法解组它 生成一个异常 例如 为了简短
  • 行类型 Spark 数据集的编码器

    我想写一个编码器Row https spark apache org docs 2 0 0 api java index html org apache spark sql Row html输入 DataSet 用于我正在执行的地图操作 本
  • 如何从客户端设置 HTMLEditorExtender HTML

    我无法让它工作 这是我在另一个线程中找到的代码 但它对我不起作用 我得到 set content 不是函数 find set content whatever 这仍然有效吗 我还尝试设置它扩展的文本框的值 尝试设置两者的 InnerHtml
  • 从通用对象访问字段变量

    我有两节课ClassOne and ClassTwo 更新公共字段data i e public class ClassOne public byte data new byte 10 Thread that updates data an
  • Swift 2.0:协议扩展:具有相同函数签名的两个协议编译错误

    鉴于这两个协议及其扩展 protocol FirstDelegate func someFunc protocol SecondDelegate func someFunc extension FirstDelegate func some
  • 如何让Maxima的输出更干净?

    我想利用 Maxima 作为后端来解决 LaTeX 输入文件中使用的一些计算 我执行了以下步骤 Step 1 下载并安装 Maxima Step 2 创建一个名为的批处理文件cas bat 例如 如下 rem cas bat echo of
  • 在一元上下文中使用 Data.Map

    我正在操作的地图具有单子键 类型为IO Double 我需要使用findMax在这张地图上 我可以用吗liftM为了这 Map findMax Map fromList f x X f y Y f z Z Here f x有类型IO Dou
  • 获取预转译源代码的 Karma 代码覆盖率

    我使用 Karma 来运行测试 使用 webpack 来捆绑文件 并使用 babel 进行 es6 gt es5 转译 我已经运行了测试并生成了代码覆盖率 但代码覆盖率数字是针对转译后的源文件的 是否有办法获得原始源文件的代码覆盖率 我尝试
  • 3D 旋转 - 透视

    public class MainActivity extends Activity LinearLayout rotator protected void onCreate Bundle savedInstanceState super
  • 如何阻止ubuntu在使用apt安装或更新软件包时弹出“Daemons using outdatedlibraries”? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我最近新安装了 Ubuntu 22 04 LTS 我发现每次使用 apt 安装或更新软件包时 它都会询问我有关Which servic
  • 在 .NET 的同一解决方案中使用两个 IoC 容器的缺点?

    我正在开发一个项目 该项目使用来自其他开发人员的一组库 该库使用结构图 http structuremap github io作为 IoC 容器 我有代码库 我们合并这些库的应用程序使用统一容器 https learn microsoft