【问题标题】:Should I make all types generic for interfaces of classes that I depend upon?我应该为我所依赖的类的接口使所有类型都通用吗?
【发布时间】:2017-11-04 13:38:27
【问题描述】:

好的,所以我正在尝试解耦我的代码。我不想到处使用单例,而是想对接口使用依赖注入。到目前为止一切顺利。

现在,我有一个大型网络类,它使用其他网络类作为其方法的参数或返回类型。例如:

public class Network
{
    void OnServerError(NetworkConnection conection, int errorCode);
}

public class NetworkConnection
{
    public NetworkError lastError { get; }
}

public class NetworkError
{
    public string Error { get; private set; }
}
  1. 为 Network 类创建接口是否有意义?
  2. 如果是这样,我是否需要将所有类型设为通用?对于具有公共方法的类的类型,我是否还需要为其创建接口?基本上在类中继续深入,直到一切都成为接口或泛型类型?
  3. 我想为这个类创建一个接口的原因之一是我将来可能会切换到不同的网络库,我不想在任何地方重构所有东西,尽管我的初始接口将具有相同的签名几乎我现有的网络课程,所以我可能不得不在未来重构它。我错过了什么?

【问题讨论】:

  • 这里真正的问题是你的Network 类是否也被注入到其他类中......如果是这样,那么它可能会有用。正如 Glenn 的回答所指出的:DI 不需要接口,它们只是有用的。真正的答案完全取决于您,这取决于您的要求。您是要进行构造函数还是属性注入?你用的是什么容器?

标签: c# dependency-injection interface


【解决方案1】:

您不一定需要将Network 设为接口才能利用依赖注入。

当我处于一个项目的十字路口时,当没有明确的理由从我的类中提取接口时,我想,“我是否要为测试场景编写这种类型的 Mock 实现?”

在某些测试中,您可能想要模拟某些场景或行为。模拟实现对此非常有用。

它对某些类有意义,但并非在所有情况下都有意义。

希望这会有所帮助!

【讨论】:

  • 对于 Network 类,我可以看到我可能想要模拟它,因为我希望我的单元测试不依赖于网络连接并且只测试它负责做的事情。如果是这种情况,我应该接口所有东西吗?
  • 鉴于提取接口的成本如此之低(尤其是在使用 Resharper 的情况下),许多开发人员默认连接(几乎)所有东西的情况并不少见。
猜你喜欢
  • 2012-07-17
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
相关资源
最近更新 更多