Dependency injection 依赖注入的适当性

Dependency injection 依赖注入的适当性,dependency-injection,inversion-of-control,Dependency Injection,Inversion Of Control,好的,我想我已经基本了解了IoC以及与之相关的模式、依赖注入和服务定位器模式。 从我所读到的内容来看,向类构造函数中注入依赖项似乎比服务定位器更有利于松散耦合。 我很难理解,也找不到任何关于它的书面材料,如果我想从一个高级类实例化一个对象,该怎么办?我是否需要更改调用新类的类的构造函数?如果是这样的话,那就意味着我必须更改对该构造函数的每次调用以及进行该调用的每个类的构造函数,以及对根的调用。这似乎非常麻烦和不安全。在这种情况下,服务定位器是否更合适? 如有任何建议,将不胜感激 简单的例子: c

好的,我想我已经基本了解了IoC以及与之相关的模式、依赖注入和服务定位器模式。 从我所读到的内容来看,向类构造函数中注入依赖项似乎比服务定位器更有利于松散耦合。 我很难理解,也找不到任何关于它的书面材料,如果我想从一个高级类实例化一个对象,该怎么办?我是否需要更改调用新类的类的构造函数?如果是这样的话,那就意味着我必须更改对该构造函数的每次调用以及进行该调用的每个类的构造函数,以及对根的调用。这似乎非常麻烦和不安全。在这种情况下,服务定位器是否更合适? 如有任何建议,将不胜感激

简单的例子:

class car
void car(iBrand brand, iModel model){
     _brand=brand;
     _model=model;
}

class brand : iBrand 
void brand (iModel model){
     _model=model;
}

class model : iModel
void model()
这是一个特别粗糙的例子,但希望我的观点能被理解。这些对象中的每一个都实例化了下面的类。现在,如果我想在模型类中创建一个iEngine,这是否意味着它必须从顶部向下传递,包括传递到汽车构造函数中

class car
void car(iBrand brand, iModel model, iEngine engine){
     _brand=brand;
     _model=model;
    _engine=engine;
    }
谢谢,
H

应用程序中应该只有一个地方正在实例化;这个因此,除了复合根之外,应该没有人在调用组件的构造函数。组成对象图的应该是合成根

如果类型直接使用依赖项,则依赖项只应包含在类型的构造函数中。在您的示例中,
Brand
Car
都依赖于
IModel
,但如果
Car
不需要直接与
IModel
交互,则不应将模型注入
Car
。或者想象一个依赖于
IUserRepository
UsersController
类。如果需要通过一些日志扩展
UserRepository
,则
userscocontroller
不必知道这一点。您只需将
ILogger
注入
UserRepository
的构造函数中,
userscoontroller
不受影响


由于组合根是调用构造函数的唯一位置,并且添加依赖项不应该影响整个依赖关系图,因此更改构造函数应该意味着只影响组合根(当然,除了所讨论的类之外)。如果您使用DI框架,在大多数情况下甚至可以避免任何更改。

您能用一个例子来说明您的问题吗?希望这个例子足够了。谢谢,史蒂文。嗨,史蒂文,这很有道理。谢谢我看到的问题是,类可能需要依赖于IoC容器,而与纯依赖注入一样,只有组合根依赖于IoC容器。这是正确的吗?您的应用程序代码永远不应该依赖于容器,而且总有办法防止这种情况发生。只有放置在组合根中的内部结构类才应该依赖于容器(如果需要)。如果您认为您需要依赖容器,请在这里向SO提问。