.net IoC容器实现依赖注入的方式与我实现它的方式相比

.net IoC容器实现依赖注入的方式与我实现它的方式相比,.net,database-design,frameworks,dependency-injection,inversion-of-control,.net,Database Design,Frameworks,Dependency Injection,Inversion Of Control,要进行依赖项注入,我可以创建一个不同类型db连接的通用字典,然后通过反射动态实例化一个类型,然后将其传递给需要它的对象的构造函数 使用IOC容器会带来什么不同和好处,因为它不会使我的东西比第一个解决方案更独立。IOC容器在内部将如何工作?它与第一个解决方案不同吗 如果没有容器,您将如何实现DI?什么时候切换到IoC容器 我的意思是,除了我考虑过的使用最佳方法之外,还有其他实现DI的方法吗?依赖注入与字典无关。正如尼古拉斯·布卢姆哈特(Nicholas Blumhardt)在一篇优秀的博客文章中所

要进行依赖项注入,我可以创建一个不同类型db连接的通用字典,然后通过反射动态实例化一个类型,然后将其传递给需要它的对象的构造函数

使用IOC容器会带来什么不同和好处,因为它不会使我的东西比第一个解决方案更独立。IOC容器在内部将如何工作?它与第一个解决方案不同吗

如果没有容器,您将如何实现DI?什么时候切换到IoC容器


我的意思是,除了我考虑过的使用最佳方法之外,还有其他实现DI的方法吗?

依赖注入与字典无关。正如尼古拉斯·布卢姆哈特(Nicholas Blumhardt)在一篇优秀的博客文章中所解释的那样,你需要一个彻底的解决方案

通过应用构造函数注入组合根设计模式,DI是松耦合的。当DI容器进入图片时,它会通过模式进入图片


因此,如果一个类需要一个db连接,它会通过构造函数请求一个连接。

我想容器会为您提供大量的锅炉板代码。例如,它完全按照您所说的做,根据反映的行为实例化一个类。许多容器还允许您根据配置文件显式配置系统

IOC或DI只是概念。IOC/DI概念为您提供了您喜欢的“独立性”。实际实现可能会有所不同。您可以不用使用第三方容器来完成,也可以自己编写。或者,您可以利用经过良好测试的第三方容器提供的功能

如果您只想注入不同类型的db连接,那么您对IOC/DI的需求很小。一般来说,IOC/DI(注意,不是容器,它只是IOC/DI的一个实现)为您提供完全可配置的软件、单元测试辅助(通过注入存根)、自配置等

通常,在以下情况下需要IOC/DI:

  • 你的软件是如此庞大和复杂,以至于没有一个人能把所有的东西都记在脑子里,或者
  • 有太多不同的配置,您不需要自定义版本,或者
  • 这些部件之间相互依赖,因此很难单独测试每个部件

  • 没有人说您需要使用IoC容器,只是IoC容器是预先构建的,您不必自己编写代码。这意味着你可以专注于构建你的应用程序,而不是你自己的DI系统

    这就像构建UI或使用第三方控件一样。这两种方法都有效,这取决于你想把时间花在哪里。我知道我并不太关心构建自己的DI系统,所以我宁愿使用预构建的DI系统

    您可能会问,既然可以直接编写操作系统API,为什么还要使用框架呢。这一切都是为了提高可靠性(通过重用别人已经编写的代码并花费大量时间确保代码没有bug)和提高生产率(不必自己编写所有代码)

    编辑:


    有很多方法可以实现DI。你可以随时查看所有的容器,以及它们是如何工作的。它们都是开源的,源代码是可用的。

    我没有说DI是字典!我正在解释如何使用字典和反射实现DI,以便在运行时将依赖关系传递给构造函数。您不必使用IOC容器来进行DI,这是我的观点,您似乎假装DI=>IOC容器,因为您需要注册Resolve Release来管理所谓的生命周期。这是实现,我在两个实现之间进行了讨论。因此,我更改了标题以使我的问题更清楚,我谈论的是实现,而不是什么是DI概念。我的问题不是一般性,而是实现。IOC容器如何实现DI与我如何实现DI相比?@user310291-你的问题不是很清楚,因为我根本没有从你的问题中了解到这一点。您似乎在问,是否有任何技术理由使用其中一种。如果这不是你的意思,那么我建议改写你的问题。好吧,我重新表述:“与我将如何实现依赖注入相比,IoC容器如何实现依赖注入”。所以这是关于如何让我真正选择自己:)“你可以随时查看所有的容器,以及它们是如何工作的。”我不想知道,因为我只是想知道原理,因为我没有时间研究它们:)那么,如果你没有时间研究,为什么你有时间建立自己的?谢谢你,这正是我想要的答案。除了我所想到的方法之外,还有其他方法来实现DI吗?我相信不同的实现会使用不同的方法。然而,它们都应该是基于“类”或“接口”的。它们的不同之处在于如何实例化某些类或如何“自动注入”到类的公共属性中。一般来说,它们都会这样做:1)构建映射到接口/基类的类目录,如字典;2)实例化相关的类对象并“注入”,如果有多个可能的选择,则根据某些规则选择一个,可以是配置文件或其他规则。