作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在练习如何使用 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/
我是一名优秀的程序员,十分优秀!