【发布时间】:2019-04-12 14:34:36
【问题描述】:
为了可测试性,我使用了以下两种模式,但我想知道哪个是更好的 OOP/SOLID。
模式一:提供两个构造函数,其中一个创建具体依赖
public MyClass
{
private IDependency dependency;
public MyClass() : this(new ConcreteDependency()) { }
public MyClass(IDependency dependency)
{
this.dependency = dependency;
}
}
模式2:基类有依赖初始化器,派生类用具体依赖调用它
public abstract MyClassBase
{
private IDependency dependency;
protected void Initialize(IDependency dependency)
{
this.dependency = dependency;
}
}
public MyClass : MyClassBase
{
public MyClass()
{
Initialize(new ConcreteDependency());
}
}
【问题讨论】:
-
我都不建议。如果您使用的是 DI,那么我将删除您上面所有缺少参数的构造函数。如果可能,您的课程根本不应该提及
ConcreteDependency。关于ConcreteDependency,唯一应该知道的是你的 IoC 容器。 -
您还提到了可测试性。在这种情况下,您的单元测试应该负责注入具体的类(或
mocks进行更多与实现无关的测试) -
@NPras 单元测试将是 Pattern1 中的第二个构造函数或 Pattern 2 中的基类
-
你能告诉我们为什么你没有按照我在第一条评论中的建议去做吗?为什么你觉得需要两个构造函数?
标签: c# oop design-patterns dependency-injection