gpt4 book ai didi

c# - 解耦依赖于构造函数接受参数的另一个类的类

转载 作者:行者123 更新时间:2023-11-30 13:53:32 25 4
gpt4 key购买 nike

我一直在练习如何使用 SOLID 编写干净的代码。我也一直在我的代码中使用 DI 来消除耦合,但只能通过构造函数注入(inject)。在我使用 DI 的许多情况下,我只是用它来调用方法。我还不明白的是当你有一个依赖类的构造函数在另一个类中接受参数时如何解耦。如果 var obj = new A(month) 在 B 类中创建依赖和紧耦合,我该如何解耦/抽象它?这是带有属性的接口(interface)出现的地方吗?如果是这样,我该如何在这里使用它?

public class A 
{
private string _month;
public A(string month)
{
_month = month;
}
}

public class B
{
public List<A> ListOfMonths;
public B()
{
ListOfMonths = new List<A>();
}

public List<A> SomeMethod()
{
string[] months = new []
{
"Jan",
"Feb",
"Mar"
};

foreach(var month in months)
{
var obj = new A(month); // If this is coupling, how do I remove it?
ListOfMonths.Add(obj)
}

return ListOfMonths;
}
}

最佳答案

如果你想解耦,你需要从 B 中删除对 A 的任何引用,并用 IA(类似于 A 的接口(interface))替换它们,IA 是任何将替换 A 的类的占位符。

然后在 B 的构造函数中,您提供一个能够创建 IA 实例的工厂。通过放置一个抽象工厂,您可以走得更远,这意味着您提供了一个能够创建 IA 实例的工厂接口(interface)。

这是一个基于您的代码的示例:

    public interface IA
{
}

public interface IAFactory
{
IA BuildInstance(string month);
}

public class AFactory : IAFactory
{
public IA BuildInstance(string month)
{
return new A(month);
}
}

public class A : IA
{
public A(string month)
{
}
}

public class B
{
private readonly IAFactory factory;
public List<IA> ListOfMonths;

public B(IAFactory factory)
{
this.factory = factory;
ListOfMonths = new List<IA>();
}

public List<IA> SomeMethod()
{
string[] months = new[] {"Jan", "Feb", "Mar"};
foreach (var month in months)
{
var obj = factory.BuildInstance(month);
ListOfMonths.Add(obj);
}

return ListOfMonths;
}
}

关于c# - 解耦依赖于构造函数接受参数的另一个类的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56953079/

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