【发布时间】:2013-06-28 02:33:48
【问题描述】:
如果我有一个通过构造函数依赖注入服务的基类:是否可以在不使用: base (params) 的情况下声明子类的构造函数?
public MyBaseClass
{
private IServiceA _serviceA;
private IServiceB _serviceB;
private IServiceC _serviceC;
public MyBaseClass(null, null, null)
public MyBaseClass(IServiceA serviceA, IServiceB serviceB, IServiceC serviceC)
{
_serviceA = serviceA;
_serviceB = serviceB;
_serviceC = serviceC;
}
}
还有一个注入了一些额外依赖的子类:
public MySubClassA : MyBaseClass
{
private IServiceD _serviceD;
public MySubClassA (null, null, null, null)
public MySubClassA (IServiceA serviceA, IServiceB serviceB,
IServiceC serviceC, IServiceD serviceD)
: base (serviceA, serviceB, serviceC)
{
_serviceD = serviceD;
}
}
这里的问题是我有多个子类,现在只有10个左右,但数量会增加。每次我需要向基类添加另一个依赖项时,我都必须遍历每个子类并在那里手动添加依赖项。这个手工工作让我觉得我的设计有问题。
那么是否可以在子类的构造函数中声明MyBaseClassA的构造函数而没有基类所需的服务呢?例如,MyBaseClassA 的构造函数只有这么简单的代码:
public MySubClassA (null)
public MySubClassA (IServiceD serviceD)
{
_serviceD = serviceD;
}
我需要在基类中更改什么,以便在那里发生依赖注入并且不需要将其添加到子类中?我正在使用 LightInject IoC。
【问题讨论】:
-
你的 IoC 容器不能注入属性而不是构造函数吗?我认为它会简单得多,特别是如果你是深度嵌套的类和大量的注入。
-
除了西蒙的其他想法..您可以围绕这些依赖项(如果您愿意的话,一个依赖项的容器)抛出一个包装器作为另一种解决方案。虽然我更喜欢属性方法。
-
@SimonBelanger 应用程序中的所有其他内容都使用参数注入。我认为在应用程序的某个部分尝试了属性注入,并且有一些我已经忘记的问题 - 我将不得不重新考虑。
-
@SimonWhitehead 是的,一个包装器可能会起作用,我可以尝试创建一个依赖模型,然后只有一个参数进入基类,如果我需要添加更多依赖项,我只需添加将它们添加到模型中,并且所有子类都不需要更改
-
无论如何,拥有这么多子类绝对是对设计疏忽的暗示(回答您的一个问题)。 @SimonWhitehead 选项也会更简单,但是您将自己绑定到服务定位器。
标签: c# dependency-injection inversion-of-control subclass base-class