如何最大限度地利用有限的谷歌广告预算
2021年9月27日

ASP中的依赖注入.净
介绍
面向对象设计的五个原则(简称为 固体)是设计软件时要遵循的一个很好的经验法则. 在本文中,我们将集中讨论固体中的“D” 依赖性倒置原则 以及如何使您的软件更易于维护和测试. 提供的示例是特定于ASP的.净 MVC应用程序,但所讨论的原则可以应用于任何语言编写的软件.
类和依赖关系
一个类依赖另一个类, 或类耦合, 没有遵循依赖倒置原则,在设计应用程序时应该避免. 如果您在一个类中“更新”对象,那么您正在紧密耦合您的类! 这可能会导致维护问题,因为如果一个类中的某些内容发生了更改, 它会影响其他班级.
在下面的示例中,我正在创建我的数据存储库的一个新实例(在 库模式),并调用GetAll方法返回所有的辣椒烹饪关闭条目. 这是强烈耦合我的数据存储库到我的控制器.
避免类耦合, 当对象依赖于抽象时,应该使用单个实现, 不具体的. 在下面的例子中, 而不是直接调用存储库, 我们调用到存储库的接口. 这消除了对存储库具体实现的依赖.
在上面的例子中, 而我们已经解决了类耦合问题, 对于如何有效地维护这些代码,我们产生了一个不同的问题. 如果我们的应用程序中有10个类,而不是一个存储库类,那会怎么样呢? 代码中有多少地方需要实例化这20个类? 如果实现发生了变化,而我们不得不回溯,那么这将很快变得难以处理. 正如我们稍后将看到的,依赖注入容器可以帮助解决这个问题.
依赖注入的解释
依赖注入是一种体系结构模式,通过拥有不创建其他依赖对象的对象来轻松满足类的依赖关系. 它允许我们编写解耦的代码,从而简化组件的部署和测试. 通常, 您将希望使用依赖注入容器来促进此模式的实现. 尽管你可以自己写, 没有必要重新发明轮子,因为您有许多选择的容器工作得很好 .净.
依赖注入容器
依赖注入容器是一个存储库,用于存储通常将抽象与具体类关联起来的定义. 通过为我们提供注册类和解决请求的工具,它提供了两个关键的功能. 简而言之, 它自动根据请求创建对象,并在需要时注入它们,而不需要编码. 这使得在我们的应用程序中以一种简单有效的方式管理依赖关系变得非常容易. 容器处理类之间的所有请求,并为您将变量注入接口.
有很多依赖注入容器可供使用 .净和MVC 6甚至内置了一个简单的依赖注入容器,随时可以使用. 可以使用include的依赖注入容器示例 Ninject, 温莎城堡, StructureMap, AutoFac. 这些都可以通过Visual Studio中的NuGet包获得,它们背后都有很多支持,但它们的实现方式和特性有所不同. 我个人更喜欢Ninject,我认为它真的很容易实现和使用.
首先,安装Ninject和Ninject.MVC5 NuGet包在您的解决方案.
配置Ninject, 首先创建一个自定义依赖解析器,这样MVC就可以创建它需要服务请求的类实例. 这只是允许Ninject完成其工作的基本管道代码. 创建一个新的类文件“NinjectDependencyResolver”.在一个名为“基础设施”的新文件夹中,然后输入以下代码.
下一个, 在AddBindings方法中添加绑定,以设置接口和实现接口的类之间的关系. 在下面的例子中, 我们正在数据存储库接口和实现该接口的存储库类之间创建关系.
最后,您必须注册创建的自定义依赖解析器. 通过注册它,您将在Ninject和MVC框架之间建立一座桥梁. 安装Ninject时.MVC5包,它创建一个类文件“NinjectWebCommon”.在“App_Start”文件夹中. 编辑该类并在RegisterServices方法中输入以下代码.
现在可以让容器开始工作了. 在下面的例子中,我们将存储库接口注入到控制器的构造函数中,从而打破了控制器对存储库的依赖. 请注意,我们不需要编写任何代码来将接口传递给控制器. Ninject自动为我们处理这个问题.
现在,我们可以以松散耦合的方式调用控制器中的存储库.
我们还可以有效地为控制器创建单元测试,而不依赖于存储库. (注意,我正在使用 Moq NuGet包创建一个存储库的模型,让我们独立于存储库测试控制器方法).
结论
使用接口来构建解耦组件和使用依赖注入容器对于编写易于维护的软件至关重要, 扩展, 和测试.