C#中的IOC(控制反转)

本文中,我们将讨论C#中的IOC,即控制反转。作为一个开发者,你可能对IOC(控制反转),DIP(Dependency Inversion Principle,依赖反转原则),DI(Dependency Injection,依赖注入)设计模式,和IOC容器都比较熟悉或者有所了解。但是你确定了解它们之间的差别,以及具体的使用么?本文将介绍如下几个要点:.

  1. 设计原则和设计模式的区别

  2. 控制反转(IOC)

  3. 理解DIP(依赖反转原则)

  4. 理解DI设计模式

  5. IOC容器

设计原则和设计模式的区别

在编程的世界中,设计原则和设计模式是不尽相同的。

设计原则

设计原则提供了一些高级指导原则,或者你可以说是使软件设计更易于理解、灵活和可维护的机制。它们(即设计原则)不提供任何实现,也不受任何编程语言的约束。因此,无论编程语言如何,你都可以使用设计原则。示例:固体(SRP、OCP、LSP、ISP、DIP)设计原则。例如,单一责任原则(SRP)规定,一个类应该只有一个改变的理由。这是在为应用程序设计类时需要记住的首要要点。SRP没有提供任何具体的实施步骤,但我们如何在应用程序中实施单一责任原则取决于我们。

设计模式

设计模式是我们在日常编程中遇到的问题的可重用解决方案。它们基本上用于解决对象生成和集成的问题。例如,如果您想创建一个对整个应用程序只能有一个实例的类,那么可以使用单例设计模式,该模式确保一个类对整个应用只有一个实例,并提供一个全局访问点。例如“四人帮”模式:抽象工厂、工厂、单例等。

一旦你了解了设计模式和设计原则之间的区别,让我们了解一下术语IoC(控制反转)、DIP(依赖反转原则)、DI(依赖注入)设计模式和IoC容器。下图让您清楚地知道它们是原则、模式还是框架。

C#中的IOC(控制反转)

作为原则,它们只提供了一些开发软件应用程序的高级指南或机制,但没有提供任何具体的实现细节。依赖注入是一种设计模式,而IoC容器是框架。

控制反转(IOC)

C#中控制反转(IoC)的主要目标是消除应用程序对象之间的依赖关系(消除紧密耦合),从而使应用程序更加解耦和可维护。

IoC设计原则建议在面向对象设计中反转各种类型的控件,以实现应用程序类之间的松散耦合。在这里,控制意味着一个类除了其主要或基本职责之外的任何额外职责。例如,对应用程序流的控制、对依赖对象创建的控制等。

假设您有一个Repository类,Repository类负责从数据源向您提供数据。Repository类可以自己建立到数据源的连接,而无需任何其他人的输入。但是,考虑到这种情况,如果允许您通过Repository类构造函数传递有关数据源的连接详细信息呢?

通过允许调用方通过类构造函数提供连接详细信息,我们实际上已经将数据源连接依赖性与Repository类分离,允许任何数据源与存储库一起工作,而不是存储库指定的数据源。在这里,我们通过将创建数据源的连接详细信息的责任从存储库类交给调用者类来颠倒了控制。

Martin Fowler建议使用术语“依赖注入”来描述这种类型的控制反转,因为控制反转是一个原则,它可以比在构造函数中简单地注入依赖更全面地使用。

理解DIP(依赖反转原则)

C#中的依赖反转原则也帮助我们实现类之间的松散耦合。强烈建议同时使用DIP和IoC,以实现类之间的松散耦合。DIP(DIP)指出,高级模块/类不应依赖于低级模块/类。两者都应该依赖于抽象。其次,抽象不应依赖于细节。细节应该取决于抽象。

我们需要保持高级别模块和低级别模块尽可能松耦合。当一个类知道另一个类的设计和实现时,就会产生这样的风险:如果我们对一个类进行任何更改,就会破坏另一个类别。因此,我们必须尽可能保持这些高级和低级模块/类的松散耦合。要做到这一点,我们需要使它们都依赖于抽象,而不是相互了解。

DIP由罗伯特·马丁(又名鲍勃叔叔)发明。他是SOLID原则的创始人。

理解DI设计模式

依赖注入(DI)设计模式是一种软件设计模式,它允许我们通过反转依赖对象的创建来开发松散耦合的代码。依赖注入是减少软件组件之间紧密耦合的好方法。DI还使我们能够更好地管理软件中的未来变化和其他复杂性。

IOC容器

IoC容器是一个很好的框架,可以在整个应用程序中创建依赖项,并在需要时自动注入它们,这样我们作为软件程序员就不必在其中投入额外的时间和精力。它根据请求自动创建必要的对象,并在任何需要时自动插入它们。DI容器帮助我们以简单明了的方式管理应用程序中的依赖关系。

有不同的IoC容器可用于.NET,如Unity、Ninject、StructureMap、Autofac等。

我们不能仅仅利用C#中的IoC来实现松散耦合的类。除了IoC之外,我们还需要利用DIP、DI和IoC容器来实现松耦合。下图说明了我们将如何在接下来的几篇文章中逐步实现松耦合设计。

C#中的IOC(控制反转)

总结

依赖(Dependency):就是有联系,表示一个类依赖于另一个类。
依赖倒置原则(DIP):设计模式六大原则之一,是一种软件架构设计原则。
控制反转(IoC):一种软件设计原则,上层对下层的依赖(即底层模块的获得)交给第三方。
依赖注入(DI):实现IoC的一种方式、手段。
IoC容器:依赖注入的框架,用来映射依赖,管理对象的创建和生存周期。