首页 > 解决方案 > 解耦依赖于另一个类的类,该类的构造函数带有参数

问题描述

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

标签: c#dependency-injectionsolid-principles

解决方案


如果要解耦,则需要从 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;
        }
    }

推荐阅读