英雄
 

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包创建一个存储库的模型,让我们独立于存储库测试控制器方法). 

结论

使用接口来构建解耦组件和使用依赖注入容器对于编写易于维护的软件至关重要, 扩展, 和测试.

我们正在招聘开发人员!

来和我们获奖的团队一起工作吧! 我们正在寻找完整的堆栈, 在汉普顿路和里士满弗吉尼亚州的职位中到高级开发人员. 查看我们的招聘页面,了解当前的职位空缺,今天就把你的简历发给我们!

约翰Hadzima
约翰Hadzima核心因素

约翰Hadzima是博悦注册登录的解决方案架构师和团队领导,也是微软认证的解决方案开发人员. 他在Hampton Roads做了20多年的开发人员,从事各种语言和数据库的开发工作,偶尔也会开发手机应用. 约翰喜欢冲浪、骑公路自行车、打高尔夫球,他的两个儿子使他忙得不可开交.

让我们来谈谈你的项目.

我们是一家提供全方位IT和数字营销服务的公司. 我们相信,成功的项目是与我们的客户合作和透明的结果. 您是否正在为您的网站或应用程序寻找更好的用户体验? 需要有经验的数据库架构师或业务分析师? 让我们谈谈!

X