理解.NET IoC:依赖反转(DIP)、控制反转(IoC)与依赖注入(DI)

2 下载量 159 浏览量 更新于2024-08-30 1 收藏 64KB PDF 举报
.NET IoC模式依赖反转(DIP)、控制反转(IoC)和依赖注入(DI)是软件设计中的核心概念,它们在提升代码可扩展性、可维护性和可测试性方面起着至关重要的作用。 依赖倒置原则(DIP)是面向对象设计的基础之一,它提倡将依赖关系从具体实现转向抽象接口。DIP的两个主要规则是: 1. 高层次的模块不应依赖低层次的模块,两者都应依赖其共同的抽象接口。这确保了高层模块的独立性,降低因底层模块变动带来的影响。 2. 抽象接口不应依赖具体实现,而具体实现应依赖抽象接口。这允许在不影响其他组件的情况下添加、修改或替换具体实现。 在给定的代码示例中,`Ordering`类依赖于`SendingEmail`类来发送通知。当业务需求改变,比如需要发送短信而不是邮件时,我们必须直接修改`Ordering`类,这违背了DIP。正确的做法是定义一个抽象接口,如`ISending`,然后让`SendingEmail`和新的`SendingSMS`类实现这个接口。`Ordering`类只依赖于`ISending`接口,而不关心具体实现。这样,添加新需求时,只需更改依赖注入的实现,无需修改原有代码。 控制反转(IoC)是一种设计思想,它通过第三方容器来管理对象的创建和对象之间的依赖关系。在.NET框架中,IoC容器如 Autofac、Unity 和 Ninject 可以帮助我们实现这一目标。它们负责创建对象,根据配置决定何时以及如何将依赖注入到需要它们的类中。 依赖注入(DI)是IoC的一个具体实现,它允许我们在运行时将依赖关系传递给类,而不是由类自己去查找或创建。有三种常见的依赖注入方式: - 构造函数注入:通过类的构造函数传递依赖。 - 属性注入:通过设置类的公共属性来注入依赖。 - 方法注入:通过调用类的方法来注入依赖。 在.NET中,.NET Core 自带了一个轻量级的IoC容器,可以方便地进行依赖注入的配置。例如,我们可以注册`ISending`接口及其实现,并在需要的地方通过构造函数注入依赖: ```csharp services.AddSingleton<ISending, SendingEmail>(); // 或者在需求改变时,替换为 services.AddSingleton<ISending, SendingSMS>(); public class Ordering { private readonly ISending _sender; public Ordering(ISending sender) { _sender = sender; } public void Order(string message) { // Order business operation _sender.Send(message); } } ``` 这样,`Ordering`类不再直接创建`SendingEmail`实例,而是通过构造函数接收依赖,实现了依赖的外部控制和反转。当需要更换发送方式时,只需要调整IoC容器的配置,而不需要修改`Ordering`类的代码,大大提高了代码的灵活性和可维护性。