C# 在基类的构造函数中添加一个新参数意味着我必须重构从它继承的所有类?

C# 在基类的构造函数中添加一个新参数意味着我必须重构从它继承的所有类?,c#,dependency-injection,inversion-of-control,castle-windsor,C#,Dependency Injection,Inversion Of Control,Castle Windsor,我使用的是温莎城堡反转控制容器 我发现,如果需要通过基类上的构造函数注入新组件,那么从基类继承的所有子类都需要将该组件传递给基类的构造函数。这是意料之中的 但是,如果我有几十个从基类继承的子类,还有几十个实例化这些子类的单元测试呢。我真的需要遍历并重构所有这些构造函数以及对这些构造函数的调用吗?我是否缺少一种设计模式,它允许我轻松修改基类构造函数,而不必重构该类的所有子类?是的 在对类进行单元测试时,必须模拟出依赖关系并将其传递给构造函数 我假设继承基类的所有子类都使用该依赖项,那么为什么您不希

我使用的是温莎城堡反转控制容器

我发现,如果需要通过基类上的构造函数注入新组件,那么从基类继承的所有子类都需要将该组件传递给基类的构造函数。这是意料之中的

但是,如果我有几十个从基类继承的子类,还有几十个实例化这些子类的单元测试呢。我真的需要遍历并重构所有这些构造函数以及对这些构造函数的调用吗?我是否缺少一种设计模式,它允许我轻松修改基类构造函数,而不必重构该类的所有子类?

是的

在对类进行单元测试时,必须模拟出依赖关系并将其传递给构造函数


我假设继承基类的所有子类都使用该依赖项,那么为什么您不希望传递该依赖项呢?

我认为解决问题的直接方法是将基类的依赖项打包到一个新类,如
BaseDependencies
,在这种情况下,基类依赖于它,如果基类有新的依赖项,则只需向
BaseDependencies
添加一个新成员。 代码如下所示:

class Base {
public Base(BaseDependencies d) {}
}

class BaseDependencies {
public DependencyA {get; set;}
public DependencyB {get; set;}
public DependencyC {get; set;}
}
另一个选项可能是重构代码,通过类组合而不是继承重用逻辑。 见:

我是否缺少一个设计模式[…]

是的,使用接口而不是基类。接口没有构造函数,所以您永远不会遇到这种接口问题


.

如果你能分享一个例子,让我们看到一个具体的例子,那就太棒了。但是,一般来说,是的。您将需要重构这些单元测试。
我是否缺少一种设计模式,该模式允许我轻松修改基类构造函数,而无需重构该类的所有子类?
添加一个新构造函数,但也保留旧构造函数。具有依赖项的基类通常表示存在设计问题;许多人认为它们是一种气味,这就是为什么“成分大于继承”的咒语存在。基类与它们的子类型是强耦合的,这就是为什么您经常看到它们的子类型的级联更改,这就是您现在看到的构造函数依赖项。