Dependency injection 构造函数注入/依赖注入-处理';根';班级

Dependency injection 构造函数注入/依赖注入-处理';根';班级,dependency-injection,inversion-of-control,constructor-injection,Dependency Injection,Inversion Of Control,Constructor Injection,我最近使用了很多依赖注入、测试驱动开发和单元测试,我开始喜欢它了 我在类中使用构造函数依赖项,这样我就可以为单元测试注入模拟依赖项 但是,当您实际需要生产环境中的对象时,处理它的最佳方法是什么 是否在要创建类的任何地方都使用DependencyInjectionContainer.Get()?或者为类创建一个空构造函数,通过DI容器解析所有依赖关系,这样做更有意义吗?不需要有默认构造函数 在生产代码中,您通常只需在应用程序中调用DependencyInjectionContainer.Get(s

我最近使用了很多依赖注入、测试驱动开发和单元测试,我开始喜欢它了

我在类中使用构造函数依赖项,这样我就可以为单元测试注入模拟依赖项

但是,当您实际需要生产环境中的对象时,处理它的最佳方法是什么


是否在要创建类的任何地方都使用
DependencyInjectionContainer.Get()
?或者为类创建一个空构造函数,通过DI容器解析所有依赖关系,这样做更有意义吗?

不需要有默认构造函数

在生产代码中,您通常只需在应用程序中调用
DependencyInjectionContainer.Get(someRootType)
即可获得根类型(例如MVC中的
HomeController
类)。由于所有类型都是使用构造函数注入创建的,因此容器将能够为您创建相关对象的整个图形。因此,从生产的角度来看,不需要有多个构造函数


因为在单元测试中,您通常希望注入所有模拟对象,所以您的测试也不会使用默认构造函数。另一方面,让每个测试直接调用被测试类的构造函数很快会导致代码变得难以维护,因为当构造函数更改时,您必须更改所有测试。相反,将该逻辑集中到测试类中的工厂方法。此工厂方法可以有多个重载,以便于测试创建被测试的类。

谢谢,我希望的解释是:)但是,当您想要“new()”该项时,您会怎么做,例如
var product=new product()。您是否会执行类似于
var product=DI.Get()的操作?实体的寿命很短,通常不是由容器创建的。它们通常由
IUnitOfWork
IRepository
@karlcasar:创建,以补充Steve所说的:“Serivce”类型的对象由DI容器构造并连接在一起。服务对象可以创建“实体”对象。DI定义定义了哪个服务与哪个服务对话,服务本身通过传递实体相互对话。因此,如果我有一个像
Product
这样的实体,并且它有一个需要使用服务的方法,那么将其内联为
DI.Get.GetRelatedProducts(this)
,是有意义的。请注意,这只是一个示例,而不是实际的代码。调用entities方法(我假设您应用DDD)的代码是一个服务,并且将其依赖项注入到其构造函数中。您可以使用方法注入将这些依赖项传递给实体。我假设如下:
void句柄(ProcessProductCommand){var product=this.repository.Get(command.ProductId);product.AssignValue(this.eventProcessor);}
.Related: