依赖注入

编写软件可以采用的一种方法是在需要时创建依赖关系。这是编写程序的一种直观方式,也是大多数人倾向于教授的方式,部分原因是它易于遵循。这种方法的一个问题是它很难测试。考虑一种基于当前日期进行一些处理的方法。该方法可能包含以下代码:

if (DateTime.Now.Date > processDate)
{
    // Do some processing
}

代码直接依赖于当前日期。这种方法很难测试,因为当前日期不容易操作。使代码更易于测试的一种方法是删除对当前日期的直接引用,而是将当前日期提供(或注入)到执行处理的方法。通过使用测试双精度来简化单元测试的设置步骤,这种依赖注入可以更容易地测试代码的各个方面。

IOC 系统

另一个需要考虑的方面是依赖关系的生命周期; 在类本身创建自己的依赖项(也称为不变量)的情况下,它负责处理它们。依赖注入将此反转(这就是为什么我们经常将注入库称为控制反转系统)并且意味着不是类负责创建,管理和清理其依赖项,而是外部代理(在此例如,IoC 系统)代替它。

这使得在同一个类的实例之间共享依赖关系变得更加简单; 例如,考虑一个从 HTTP 端点获取数据以供类使用的服务。由于此服务是无状态的(即它没有任何内部状态),因此我们在整个应用程序中只需要一个这样的服务实例。虽然可以(例如,通过使用静态类)手动执行此操作,但创建类并告诉 IoC 系统将其创建为 Singleton 更简单,其中每个类只存在一个实例。

另一个例子是 Web 应用程序中使用的数据库上下文,其中每个请求(或线程)需要一个新的 Context,而不是每个控制器的实例; 这允许在该线程执行的每个层中注入上下文,而不必手动传递。

这使得消费类不必管理依赖项。