c# - 解耦依赖于另一个类的类,该类的构造函数带有参数
问题描述
我一直在练习如何使用 SOLID 编写干净的代码。我也一直在我的代码中使用 DI 来消除耦合,但只能通过构造函数注入。在我使用 DI 的许多情况下,我只用它来调用方法。我还不明白的是当你有一个依赖类的构造函数在另一个类中接受参数时如何解耦。如果var obj = new A(month)
在 B 类中创建依赖和紧密耦合,我该如何解耦/抽象它?这是带有属性的接口进来的地方吗?如果是这样,我该如何在这里使用它?
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 的接口),它是任何将替换 A 的类的占位符。
然后在 B 的构造函数中提供一个能够创建 IA 实例的工厂。您可以通过放置一个抽象工厂走得更远,这意味着您提供了一个能够创建 IA 实例的工厂接口。
这是基于您的代码的示例:
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;
}
}
推荐阅读
- node.js - 如何安装 node-sqlite3,但跳过构建步骤并提供我自己的 sqlite3 构建?
- sql-server - 将表添加到新 EF 模型时,商店提供者的数据读取器出现错误消息
- bash - 语法错误不确定它在说什么或如何修复它
- amazon-athena - 如何从直方图中选择与最大值对应的键?
- java - Spring Security Acl 对象
- c# - 尝试捕获不显示 formatException 的错误消息
- spring - Spring Security手动身份验证不起作用
- ms-access - 如何按周计算一年信息
- javascript - Webpack 加载资源失败。捆绑.js 404
- amazon-web-services - 如何在 AWS EMR 上安装 Hadoop 3?