【发布时间】:2010-04-03 23:36:29
【问题描述】:
我们所有的报告都是根据从我们的域对象转换而来的对象图创建的。为了实现这一点,我们为每个报告都有一个 Translator 类,并且一直在使用依赖注入来传递依赖项。
这很好用,并且会产生像这样结构的漂亮类:
public class CheckTranslator : ICheckTranslator
{
public CheckTranslator (IEmployeeService empSvc
, IPaycheckService paySvc)
{
_empSvc = empSvc;
_paySvc = paySvc;
}
public Check CreateCheck()
{
//do the translation...
}
}
但是,在某些情况下,映射具有许多不同的分组选项。结果,c-tor 将变成类依赖项和参数的混合体。
public class CheckTranslator : ICheckTranslator
{
public CheckTranslator (IEmployeeService empSvc
, IPaycheckService paySvc
, bool doTranslateStubData
, bool doAttachLogo)
{
_empSvc = empSvc;
_paySvc = paySvc;
_doTranslateStubData = doTranslateStubData;
_doAttachLogo = doAttachLogo;
}
public Check CreateCheck()
{
//do the translation...
}
}
现在,我们仍然可以对其进行测试,但它不再真正适用于 IoC 容器,至少以干净的方式。另外,如果每次检查的设置不同,我们就不能再调用两次 CreateCheck。
虽然我认识到这是一个问题,但我不一定看到正确的解决方案。为每个类创建一个工厂似乎有点奇怪......或者这是最好的方法吗?
【问题讨论】:
-
您能否详细说明“不再真正适用于 IoC 容器”?你用的是什么容器?
-
不知何故,我无法理解依赖注入的奇妙之处,以及为什么它甚至是一个有自己花哨名称的模式。是什么阻止您将 bool 参数转换为属性?
-
@Hamish:它们是构造函数参数,因为它们是强制性的。将它们放在构造函数中会强制在使用组件之前明确设置它们。
-
@Hamish:这里有很多关于 SO 解释依赖注入的问题。
-
@Mauricio - 这不是 IoC 容器的问题,而是我们混合了可变和非可变依赖项。在第一种情况下,容器可以担心依赖关系图,在第二种情况下,它不再将依赖关系拉入图中,因为每次调用 CreateCheck 都需要构建 CheckTranslator(以设置属性)。