Dependency injection 依赖注入,注入一个;可注射;对象(服务)转换为新的(实体)

Dependency injection 依赖注入,注入一个;可注射;对象(服务)转换为新的(实体),dependency-injection,extension-methods,service-locator,injectable,newable,Dependency Injection,Extension Methods,Service Locator,Injectable,Newable,在编写代码时,我们应该能够识别两大类对象: 注射剂 新事物 可注入对象是在其构造函数中公开依赖项的对象(服务)。这些依赖项通常使用IoC容器解析,这些对象只能在其构造函数中请求其他可注入项 可更新对象也是在其构造函数中公开依赖关系的对象,但可更新对象只能请求其他可更新对象(实体、值对象),可更新对象的另一个特征是它们不应持有对可注入对象的引用 但在编写代码时,我们通常需要将服务(可注入)注入实体(可更新) 我一直在想,也许在一个新的对象中公开一个服务依赖性会更好地在方法级别进行,但这

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

  • 注射剂
  • 新事物

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

  • 可更新对象也是在其构造函数中公开依赖关系的对象,但可更新对象只能请求其他可更新对象(实体、值对象),可更新对象的另一个特征是它们不应持有对可注入对象的引用

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

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

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

  • 使用公开依赖关系的方法创建接口(此方法中将使用服务)

  • 为接口创建一个扩展方法,并将其放置在不同的名称空间中,可能在另一个程序集中,只需包装对使用服务定位器解析依赖关系的原始方法的调用

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

  • 你觉得怎么样
  • 在扩展方法中使用服务定位器被认为是不好的做法
  • 您将如何对扩展方法调用进行单元测试
但在编写代码时,我们通常需要“注入”服务 (可注入)到实体中(可更新)

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

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

// somehow cart already got the repository
cart.save();
你做错了。相反,你需要改变现状,做以下事情:

respository.save( cart );

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

密切相关:Thx此链接非常有用