7

在编写代码时,我们应该能够找出两个大组对象:依赖注入,注入一个“注射”对象(服务)到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对象(实体,值对象),newable对象的另一个特点是,他们不应该持有的引用可注射的对象

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

我一直在想,也许暴露在一个新对象的服务依赖项更好地做它在方法级别,但这听起来像很多工作要做....只是想着每一个方法被调用时解析依赖....嗯,这闻起来像,我们将不得不使用服务定位器反模式

我已经解决了这一问题的方法是:

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

  • 为接口创建一个扩展方法,并将其放置在不同的命名空间,也许在另一个程序集,只是包裹在调用原始的方法使用一个服务定位器

解决依赖这样做,我们有newable和注射对象之间的一致与分离使用的服务在我们的newables容易

  • 你怎么想的能力吗?
  • 在扩展方法中使用服务定位器被认为是不好的做法?
  • 你将如何单元测试扩展方法调用?
+1

密切相关:http://stackoverflow.com/questions/4835046/why-not-use-an-ioc-container-to-resolve-dependencies-for-entities-business-objec – Steven 2012-03-14 11:28:41

+0

这个链接真的有用 – Jupaol 2012-03-14 12:53:17

回答

2

但在编写代码时,我们经常需要“注入”的服务 (注射)到实体(newable)

这不是个案,如果你发现需要做到这一点,那么应该在服务中的实体中存在一些功能。

假设您的新程序为ShoppingCart,而您的注射器为数据库repository。你想能够做到这一点:

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

那么,你做错了。相反,你需要切换周围的东西和做的事:

respository.save(cart); 

如果你能提供当你觉得需要这样做的情况下,我们可以讨论这种情况的细节。