我(有点)是DI的新手,我正在尝试理解它在我维护的代码库中如何/为何使用它。我发现了一系列将数据从存储过程调用映射到域对象的类。例如:
Public Sub New(domainFactory As IDomainFactory)
_domainFactory = domainFactory
End Sub
Protected Overrides Function MapFromRow(row As DataRow) As ISomeDomainObject
Dim domainObject = _domainFactory.CreateSomeDomainObject()
' Populate the object
domainObject.ID = CType(row("id"), Integer)
domainObject.StartDate = CType(row("date"), Date)
domainObject.Active = CType(row("enabled"), Boolean)
Return domainObject
End Function
IDomainFactory注入了Spring.Net。它的实现只是有一系列方法返回各种域对象的新实例。例如:
Public Function CreateSomeDomainObject() As ISomeDomainObject
Return New SomeDomainObject()
End Function
所有上述代码都让我感到比无用更糟糕。它很难遵循,也没有任何价值。另外,据我所知,它是对DI的误用,因为它并不是真正用于局部变量的。此外,我们不需要多个域对象的实现,我们不进行任何单元测试,如果我们这样做,我们仍然不会模拟域对象。从上面的代码中可以看出,域对象的任何更改都是SP更改的结果,这意味着无论如何都必须编辑MapFromRow方法。
那就是说,我应该把这个废话扯掉,还是做一些非常棒的东西,我很想念它?
答案 0 :(得分:0)
依赖注入背后的想法是使一个类(或另一段代码)独立于接口的特定实现。上面列出的类不知道哪个类实现IDomainFactory
。具体实现通过其构造函数注入,稍后由方法MapFromRow
使用。域工厂返回ISomeDomainObject
的实现,这也是未知的。
这允许您补充这些接口的另一个实现,而无需更改上面显示的类。这对于单元测试非常实用。假设您有一个定义方法IDatabase
的接口GetCustomerByID
。测试使用此方法的代码很困难,因为它依赖于数据库中的特定客户记录。现在,您可以注入一个虚拟数据库类,该类返回由不访问物理数据库的代码生成的客户。这样的虚拟类通常被称为模拟对象。
请参阅维基百科上的Dependency injection。