依赖关系注入,将"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是也在其构造函数中公开依赖关系的对象,但Newable只能要求其他Newable对象(实体、值对象),Newable对象的另一个特征是它们不应该持有对可注入对象的引用

但在编写代码时,我们通常需要将服务(可注入)"注入"到实体(可更新)中

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

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

  • 使用暴露依赖关系的方法创建一个接口(服务将在该方法中使用)

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

这样,我们就可以在可更新和可注入对象之间实现一致的分离,并能够轻松地使用我们的可更新中的服务

  • 你觉得怎么样
  • 在扩展方法中使用服务定位器是否被认为是一种糟糕的做法
  • 您将如何对扩展方法调用进行单元测试

但在编写代码时,我们通常需要"注入"服务(可注入)到实体(可更新)

事实并非如此——如果您发现有必要这样做,那么实体中存在一些功能,这些功能应该在服务中。

假设您的newable是ShoppingCart,而您的injectable是数据库repository。你希望能够做到这一点:

// somehow cart already got the repository
cart.save();

你做错了。相反,你需要改变事情并做:

respository.save( cart );

如果你能提供一个你觉得有必要这样做的情况,我们可以讨论这种情况的细节。

最新更新