在编写代码时,我们应该能够识别两大类对象:
- 注射剂
- 新品
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 只能请求其他可更新对象(实体、值对象),可更新对象的另一个特征是它们不应该持有对可注入对象的引用
但是在写代码的时候,我们经常需要将一个服务(injectable)“注入”到一个Entity(newable)中
我一直在想,也许在可更新对象中公开服务依赖项更好地在方法级别进行,但这听起来需要做很多工作......每次调用方法时都要考虑解决依赖关系...... . 这闻起来就像我们必须使用服务定位器反模式
我解决这个问题的方法是:
使用暴露依赖项的方法创建接口(该方法中将使用服务)
为接口创建一个扩展方法并将其放置在不同的命名空间中,可能在另一个程序集中,然后将调用包装到使用服务定位器解决依赖关系的原始方法
这样做,我们可以在新对象和可注入对象之间保持一致的分离,并且能够轻松地在我们的新对象中使用服务
- 你怎么看?
- 在扩展方法中使用服务定位器被认为是一种不好的做法?
- 您将如何对扩展方法调用进行单元测试?