依赖注入

依赖注入(DI)的重点是减少代码耦合。想象一下任何类型的交互都涉及到新的东西,如硬编码依赖示例

编写代码的很大一部分是测试它的能力。每次我们新建一个新的依赖项时,我们都会使代码难以测试,因为我们无法控制该依赖项。

你将如何测试依赖于 DataTime.Now 的代码?它总是会改变,所以你没有参考。这是当你注入稳定参数作为起点时。你可以控制它,你可以根据各种值编写测试,并确保始终获得正确的结果。

因此,一个好的选择是将接口或抽象类作为参数传递给构造函数 DI。

接口表示定义良好的合同,你始终可以依赖方法,并且始终可以依赖方法签名。

一旦开始使用 DI,其他方面将会打开。例如,即使你在某个时刻传递了一个接口,你也需要一个真正的实现才能真正完成任何工作。这是其他概念出现的地方。我们可以使用 IOC(控制反转)来解决我们的依赖关系。这意味着我们指示我们的代码始终使用任何合同的特定实现。当然还有其他方法可以做到这一点。我们总是可以使用特定的实现来实例化每个合同,从那时起我们的代码就可以使用该部分:

public ILogging Logging { get; set }

在某些时候我们初始化它。

Logging = new FileLogging();

只要我们的类达到预期的合同,这将始终有效:

public class FileLogging : ILogging

从初始阶段开始,我们总是使用 Logging 对象。这使生命更容易,因为如果我们决定更改和使用 DatabaseLogging,我们只需要在一个地方更改代码,这正是我们初始化 Logging 类的地方。

DI 只适合测试吗?不,在编写可维护代码时,DI 也很重要。它可以清楚地分离关注点。

当你编写任何代码时,请认为……是可测试的,我可以编写测试,这是在注入 DateTime 值而不是使用 DateTime 时。这是有道理的。