gpt4 book ai didi

c# - 当您还需要 "default"具体依赖时,哪种依赖注入(inject)模式更好?

转载 作者:行者123 更新时间:2023-11-30 22:58:05 25 4
gpt4 key购买 nike

我已经使用了以下两种模式来实现可测试性,我想知道 OOP/SOLID 哪个更好。

模式一:提供两个构造器,其中一个创建具体的依赖

public MyClass
{
private IDependency dependency;

public MyClass() : this(new ConcreteDependency()) { }

public MyClass(IDependency dependency)
{
this.dependency = dependency;
}
}

模式二:基类有依赖初始化器,派生类用具体依赖调用它

public abstract MyClassBase
{
private IDependency dependency;

protected void Initialize(IDependency dependency)
{
this.dependency = dependency;
}
}


public MyClass : MyClassBase
{
public MyClass()
{
Initialize(new ConcreteDependency());
}
}

最佳答案

两个提供的示例都表现出 Control Freak 反模式,如 Dependency Injection, Second Edition Principles, Practices, and Patterns 中所述。 .

Control Freak 反模式出现:

every time you depend on a Volatile Dependency in any place other than a Composition Root. It's a violation of the Dependency Inversion Principle

在第一个示例中,即使 MyClass 使用了 IDependency 抽象,它也拖拽了对具体 ConcreteDependency 组件的引用,导致两个类紧耦合

在您的第二个示例中也发生了同样的紧密耦合,这实际上是相同的反模式。此外,第二个示例甚至使用 Initialize 方法将依赖项应用于已创建的 MyClassBase 实例。这导致 Temporal Coupling ,这本身就是一种代码味道。

适当的解决方案可以防止紧耦合和时间耦合,这意味着您使用构造函数注入(inject)并定义仅一个构造函数:

public MyClass
{
private IDependency dependency;

public MyClass(IDependency dependency)
{
this.dependency = dependency ?? throw new ArgumentNullException("dependency");
}
}

关于c# - 当您还需要 "default"具体依赖时,哪种依赖注入(inject)模式更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53218680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com