.NET Core和抽象(基)类的依赖注入

时间:2019-12-28 22:34:38

标签: c# inheritance dependency-injection .net-core

我有1个抽象类,供其他2个继承该类的类使用:

public abstract class FiltererBase
{
    ColorsOrderer colorsOrderer;

    public FiltererBase(ColorsOrderer colorsOrderer)
    {
        this.colorsOrderer = colorsOrderer;
    }

    protected string OrderColors(string colors)
    {
        return string.Join("", colors.ToCharArray().OrderBy(i => colorsOrderer.Order[i]));
    }
}


public class Filterer1 : FiltererBase
{
    public Filterer1(ColorsOrderer colorsOrderer)
        : base(colorsOrderer) { }
}

public class Filterer2 : FiltererBase
{
    public Filterer2(ColorsOrderer colorsOrderer)
        : base(colorsOrderer) { }
}

如您所见,我正在使用依赖注入(DI),并将从子构造函数实例化的类传递给父构造函数。

使用抽象(基)类进行DI确实是最好的方法吗? .NET Core框架不是提供一种更自动的方法吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,不可能将参数注入到父构造函数中。

您可以使用composition approach instead of inheritance

将代码重构为一种合成方法,它看起来像这样:

public class ColorFilter
{
    ColorsOrderer colorsOrderer;

    public ColorFilter(ColorsOrderer colorsOrderer)
    {
        this.colorsOrderer = colorsOrderer;
    }

    public string OrderColors(string colors)
    {
        return string.Join("", colors.ToCharArray().OrderBy(i => colorsOrderer.Order[i]));
    }
}


public class Filterer1
{
    ColorFilter colorFilter;

    public Filterer1(ColorFilter colorFilter)
    {
        this.colorFilter = colorFilter;
    }

    public string OrderColors(string colors)
    {
        return this.colorFilter(colors);
    }
}

public class Filterer2
{
    ColorFilter colorFilter;

    public Filterer2(ColorFilter colorFilter)
    {
        this.colorFilter = colorFilter;
    }

    public string OrderColors(string colors)
    {
        return this.colorFilter(colors);
    }
}