【问题标题】:Improve this design for DI and code reusability改进此设计以实现 DI 和代码可重用性
【发布时间】:2015-07-09 12:42:53
【问题描述】:

我想将 IClasses 的实现注入到其他一些客户端类中。目前的设计使得某些函数具有公共代码,我不想在 IClass 的实现中重复这些代码。为此,我引入了一个抽象类,它存储了 IClasses 的实现将从中继承的通用功能。我有以下类结构。

public interface IClasses
{
    string CommonFunc1();
    string CommonFunc2();

    string SpecialFunc1();
    string SpecialFunc2();

}

public abstract class BaseClass : IClasses
{
    public string CommonFunc1()
    {
        return "";
    }

    public string CommonFunc2()
    {
        return "";
    }

    public abstract string SpecialFunc1();
    public abstract string SpecialFunc2();
}

public class Imple1 :BaseClass, IClasses
{

    public override string SpecialFunc1()
    {
        return "11";
    }

    public override string SpecialFunc2()
    { return "12"; }
}

public class Imple2 :BaseClass, IClasses
{

    public override string SpecialFunc1()
    {
        return "21";
    }

    public override string SpecialFunc2()
    { return "22"; }
}

我想知道这个设计是否可以改进? Visual Studio 一直抱怨接口是多余的,因为抽象类中已经存在所有内容。我只想在消费类中为 DI 使用接口。如果有冗余,我该如何删除?

【问题讨论】:

  • 副手,我看不出有什么可以改进的。这是一个很常见的模式。不过,我尽量避免继承超过 1 到 2 层。比这更深,将一些功能移动到单独的接口/类中可能会更好。此外,在 .NET 中,通用约定是大写驼峰式所有函数。
  • 谢谢肯。 Visual Studio 一直抱怨接口是多余的,因为抽象类中已经存在所有内容,所以我认为还有改进的余地。
  • 猜你正在使用 Resharper 什么的。我的基本 VS 安装没有抱怨。因为它,它有点多余,但可能会随着您的解决方案成熟而改变。如果你在基类的两个常用函数中添加 virtual,它会抱怨吗?这是我认为缺少的一件事。通常,您会希望允许子类覆盖它们。
  • @user20358 即使你从类中删除了IClasses 声明它仍然会实现IClasses 接口,因为它从基类继承它,所以你会仍然可以将它传递给采用IClasses 参数的方法。试试看。
  • 我最大的问题是:IClasses 的所有消费者都需要它的所有方法吗?如果没有,你就违反了Interface Segregation Principle,这是你可以改进的。

标签: c# oop dependency-injection software-design ooad


【解决方案1】:

Imple1 不应派生自 IClasses 接口,因为它已经派生自 BaseClass 抽象类,而后者已经派生自 IClasses 接口,这意味着从 BaseClass 派生的每个类现在也派生自 IClasses,

所以你的代码应该是这样的 -

public class Imple1 :BaseClass
{

    public override string SpecialFunc1()
    {
        return "11";
    }

    public override string SpecialFunc2()
    { return "12"; }
}

也就是说,它不应该破坏 DI。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多