首页 > 解决方案 > 抽象、实体和属性注入与构造函数注入

问题描述

我在工作中与某人进行了讨论。类和接口如下所示:

public interface ISomeInterface { }

public class ImplementationOfInterface : ISomeInterface { }

public class ClassThatUsesInterface {
    private ISomeInterface _interface;

    public ISomeInterface Interface {
         get => _interface ?? new ImplementationOfInterface();
         set => _interface = value;
    }
}

99% 的时间我们会使用ImplementationOfInterface. 最后 1% 可能是单元测试的目的。

我已经尝试阅读依赖注入、依赖倒置原则、服务、SOLID 以及更多不相关的内容,如服务定位器模式/反模式、两步初始化反模式等,但没有找到任何人描述这种方式正在做。

违反了 SOLID 中的 D 已半明半白;“依赖倒置原则;一个人应该“依赖于抽象,[而不是]具体化。”因为在单元测试中覆盖它或者如果你愿意的话切换实现是相当容易的......这让我更加困惑..

即使它可能与 SOLID 中的 D 相冲突,并且在正确的依赖注入之后并没有真正做任何事情,但真的很难反对这种用法。

我个人建议通过构造函数注入实例,但我的同事认为这是太多额外的工作,并没有看到好处。老实说,我很难不同意,但我仍然对此感到不好。

你能想出文章或有力的论据来支持和反对使用这种特殊的“黑客”吗?

标签: c#oopdesign-patternsarchitecture

解决方案


ClassThatUsesInterface甚至需要知道存在的事实ImplementationOfInterface是代码异味。您可能需要using为一些完全不相关的命名空间添加一个指令才能编译,甚至可能是对其他项目或包或dll. 因此,您的代码开始纠结,并且您的依赖项开始令人头疼。

我意识到这是一个精简的演示示例,但恰好ImplementationOfInterface本身没有依赖关系。如果真的发生了怎么办?你会轮流上去吗?以及他们的依赖..?这表明您在这里违反了另一个 SOLID 原则 - 每次将args 更改为. 这违反了开放/封闭原则。newctorImplementationOfInterface


推荐阅读