依赖注入,将"可注入"对象(服务)注入新的(实体)

Jup*_*aol 7 extension-methods dependency-injection service-locator injectable newable

编写代码时,我们应该能够识别两大对象:

  • 注射剂
  • Newables

http://www.loosecouplings.com/2011/01/how-to-write-testable-code-overview.html

http://misko.hevery.com/2008/09/30/to-new-or-not-to-new/

  • 可注入对象是在其构造函数中公开依赖项的对象(服务),这些依赖项通常使用IoC容器解析,这些对象只能在其构造函数中请求其他注入项

  • Newable是在其构造函数中也暴露依赖项的对象,但是newables只能请求其他可新建对象(实体,值对象),新对象的另一个特征是它们不应该持有对可注入对象的引用

但是在编写代码时,我们经常需要将一个服务(可注入)"注入"到一个实体(newable)中

我一直在想,在一个新的对象中暴露服务依赖可能更好地在方法级别进行,但这听起来有很多工作要做....只是考虑在每次调用方法时解析依赖关系...这有点像我们必须使用服务定位器反模式

我解决这个问题的方法是:

  • 使用公开依赖项的方法创建一个接口(该方法中将使用该服务)

  • 为接口创建一个扩展方法,并将其放在不同的命名空间中,也许放在另一个程序集中,然后将调用包装到原始方法,使用服务定位器解析依赖项

这样做,我们可以在新的和可注射的对象之间保持一致的分离,并且能够轻松地在我们的新手中使用服务

  • 你怎么看?
  • 在扩展方法中使用服务定位器被认为是一种不好的做法?
  • 你如何对扩展方法调用进行单元测试?

WW.*_*WW. 4

但在编写代码时,我们经常需要将一个服务(可注入)“注入”到一个实体(可更新)中

情况并非如此——如果您发现需要这样做,那么实体中存在一些应该位于服务中的功能。

假设你的 newable 是ShoppingCart一个database,你的injectable 是一个database repository。您希望能够做到这一点:

// somehow cart already got the repository
cart.save();
Run Code Online (Sandbox Code Playgroud)

嗯,你做错了。相反,您需要扭转局面并执行以下操作:

respository.save( cart );
Run Code Online (Sandbox Code Playgroud)

如果您可以提供您认为何时需要这样做的情况,我们可以讨论该情况的具体情况。