从方法返回的局部变量的依赖注入

时间:2012-11-15 19:25:00

标签: vb.net dependency-injection spring.net

我(有点)是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方法。

那就是说,我应该把这个废话扯掉,还是做一些非常棒的东西,我很想念它?

1 个答案:

答案 0 :(得分:0)

依赖注入背后的想法是使一个类(或另一段代码)独立于接口的特定实现。上面列出的类不知道哪个类实现IDomainFactory。具体实现通过其构造函数注入,稍后由方法MapFromRow使用。域工厂返回ISomeDomainObject的实现,这也是未知的。

这允许您补充这些接口的另一个实现,而无需更改上面显示的类。这对于单元测试非常实用。假设您有一个定义方法IDatabase的接口GetCustomerByID。测试使用此方法的代码很困难,因为它依赖于数据库中的特定客户记录。现在,您可以注入一个虚拟数据库类,该类返回由不访问物理数据库的代码生成的客户。这样的虚拟类通常被称为模拟对象。

请参阅维基百科上的Dependency injection

相关问题