Jup*_*aol 7 extension-methods dependency-injection service-locator injectable newable
编写代码时,我们应该能够识别两大对象:
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 是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)
如果您可以提供您认为何时需要这样做的情况,我们可以讨论该情况的具体情况。
归档时间: |
|
查看次数: |
911 次 |
最近记录: |