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

标签 c# dependency-injection solid-principles

我一直在练习如何使用 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/

相关文章:

c# - 具有其他依赖项的 ConfigurationProvider

java - Grail Controller 是否遵循 SOLID 的单一职责原则?

c# - 在两个 ASP.NET Core 应用程序之间共享 Cookie

c# - 亚音速 3.0 一般问题

javascript - 使用 AJAX 更改 div/文本

C# 使用 DateTime.TryParseExact() 多种格式解析 DateTime

dependency-injection - C# 中的 autofac "Hello World"应用程序 - 初始化

php - Yii2 依赖注入(inject)示例

java - 下面的代码违反了哪一条 SOLID 原则?

c# - 拥有依赖于另一个存储库的存储库