Architecture 关于DI/IoC的不明确领域

Architecture 关于DI/IoC的不明确领域,architecture,dependency-injection,inversion-of-control,organization,Architecture,Dependency Injection,Inversion Of Control,Organization,我理解国际奥委会的基本概念,但我很难将视野扩展到最初的概念之外 基本上,使用DI框架时,我不应该再为具有依赖关系的对象使用new关键字,因为这样,我就不会调用DI框架解析方法,从而不会触发解析链 用户想要一个对象A谁需要一个对象B谁想要一个对象C谁 想要 这就是使用DI框架将要发生的事情。但使用新的关键字,我会留下: 我只是实例化了一个对象A 问题1:我说得对吗?错了吗?还是“视情况而定”? 我刚刚读了马克·希曼(Mark Seemann)的回答,他说: DI容器应该在 应用程序的合成根并让

我理解国际奥委会的基本概念,但我很难将视野扩展到最初的概念之外


基本上,使用DI框架时,我不应该再为具有依赖关系的对象使用new关键字,因为这样,我就不会调用DI框架解析方法,从而不会触发解析链

用户想要一个对象A谁需要一个对象B谁想要一个对象C谁 想要

这就是使用DI框架将要发生的事情。但使用新的关键字,我会留下:

我只是实例化了一个对象A

问题1:我说得对吗?错了吗?还是“视情况而定”?


我刚刚读了马克·希曼(Mark Seemann)的回答,他说:

DI容器应该在 应用程序的合成根并让开

问题2:他是否暗示应该调用DI框架(以解决某些问题)的唯一时间是从应用程序开始,并且从那时起,一切都应该很好,不管怎样?


我正在做一个项目。但是我很难定义接口和类(实体、值对象、实现)应该放在哪里(程序集、名称空间命名…)

问题3:DI是否意味着代码组织的特殊结构?


我听说域/业务层不应该引用任何DI框架

问题4:该建议是否也适用于任何其他层?还是错误?


我在两个图书馆工作(比如图书馆A和图书馆B)。LibraryB包含三个类,ClassA、ClassB和ClassC。每个类都依赖于上一个类(ClassA是根/聚合)。图书馆依赖于一流的图书馆

问题5:在LibraryB内部创建一个工厂,专门用于创建ClassA及其依赖项(仅使用新关键字),还是充分利用DI框架,手动注册ClassA、ClassB、ClassC并解析ClassA更好?

我不应该再使用新关键字了

都是关于你的。是的,您绝对应该仍然使用new关键字,但不应该使用services/injectables

他是否暗示应该调用DI框架的唯一时间(以 解决问题)是从应用程序的开始

每个请求需要解决一次。如果您的应用程序处理一个请求并死亡(例如控制台应用程序),这意味着您在启动时只需解决一次。然而,大多数应用程序类型(web应用程序、web服务、桌面应用程序等)处理许多请求(有时并发),这意味着许多“根”对象将被解析

对每个请求执行解析(无论该应用程序上下文中的“请求”是什么)很重要,因为对整个应用程序域执行单个解析将创建单个对象图,这意味着该对象图应该是线程安全的和可重用的。您可能可以让它工作,但这通常是大量的工作和容易出错。这就是为什么DI容器通常包含复杂的方法来注册具有特定范围的服务(每个web请求、每个WCF操作等)

DI是否意味着代码组织的特殊结构

不,没有。DI不会强迫您进入特定的组织结构,但您必须使用和来设计类

我听说域/业务层不应该引用任何DI框架。 该建议是否也适用于任何其他层?还是假的

是的,这个建议适用于系统的每个部分,除了您的。但请注意,层并不等于组件。看一看

在图书馆内创建工厂更好吗

如果没有更多的信息,很难回答这个问题(您可能想为此开始一个新的问题),但一般来说,每个请求只解析一个对象,让容器构建整个图形。如果LibraryA在LibraryB中使用ClassA,则LibraryA中将有一个或多个类依赖于ClassA。因此,与直接从容器解析ClassA不同,您可能应该从容器解析LibraryA的一个类,或者递归地解析它们的父类。例如,当您有一个MVC应用程序,其中包含一个依赖于ClassD的XController(来自LibA)和依赖于ClassA的XController时,在这种情况下,您应该只解析XController

我不应该再使用新关键字了

都是关于你的。是的,您绝对应该仍然使用new关键字,但不应该使用services/injectables

他是否暗示应该调用DI框架的唯一时间(以 解决问题)是从应用程序的开始

每个请求需要解决一次。如果您的应用程序处理一个请求并死亡(例如控制台应用程序),这意味着您在启动时只需解决一次。然而,大多数应用程序类型(web应用程序、web服务、桌面应用程序等)处理许多请求(有时并发),这意味着许多“根”对象将被解析

对每个请求执行解析(无论该应用程序上下文中的“请求”是什么)很重要,因为对整个应用程序域执行单个解析将创建单个对象图,这意味着该对象图应该是线程安全的和可重用的。您可能可以让它工作,但这通常是大量的工作和容易出错。这就是为什么DI容器通常包含复杂的方法来注册具有特定范围的服务(每个web请求、每个WCF操作等)

DI是否意味着代码组织的特殊结构

不,没有。DI不会强迫您进入特定的组织结构,但您必须使用和来设计类