tnblog
首页
视频
资源
登录

IOC(控制反转)与DI(依赖注入)

6869人阅读 2019/12/4 12:21 总访问:126016 评论:1 收藏:1 手机
分类: .NET MVC


IOC与DI都是为了降低类与类之间的耦合度。


耦合性

耦合性也叫块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块之间越独立则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。

形象的说,就是要将代码写的和电脑一样,主类就是电脑的主机箱,当程序需要实现什么功能的时候只需要在其他的类引入接口,就像电脑上的usb接口。


在我们实际开发中,类似于

  1. UserDAL userDAL = new UserDAL();

像这种代码,是直接关联的,依赖关系强,耦合度就很高,修改起来就很麻烦。我们就是为了降低它的耦合性,也就是提高独立性。


我们需要借助容器来进行调用,灵活性高,修改的时候只需要改容器中的代码就行了,不需要每个地方修改。

Unity插件下载地址:http://www.tnblog.net/resource/show/aojiancc2/715452b4c5774d6e9cc45fb3a8ecb1b8

下载我们需要在项目中添加引用。


那下面我们就来进行今天的详细讲解!


首先我们创建一个类库(NET58_DAL)

创建一个接口(IUserDAL)

代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace UntiyLearn.Interface
  7. {
  8.     public interface IUserDAL
  9.     {
  10.         string GetUser();
  11.     }
  12. }


再创建两个类(NewDAL、UserDAL)去实现接口

代码如下:

NewDAL

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using UntiyLearn.Interface;
  7. namespace NET58_DAL
  8. {
  9.     public class NewDAL:IUserDAL
  10.     {
  11.         public string GetUser()
  12.         {
  13.             return "贝贝";
  14.         }
  15.     }
  16. }


UserDAL

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using UntiyLearn.Interface;
  7. namespace NET58_DAL
  8. {
  9.     public class UserDAL:IUserDAL
  10.     {
  11.         public string GetUser()
  12.         {
  13.             return "小明";
  14.         }
  15.     }
  16. }


现在我们再我们的主项目中创建容器(myUnityContainer)

代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using Microsoft.Practices.Unity;
  6. using NET58_DAL;
  7. using UntiyLearn.Interface;
  8. namespace UntiyLearn.Untiy
  9. {
  10.     public class myUnityContainer
  11.     {
  12.           //创建容器
  13.         static IUnityContainer unityContainer = new UnityContainer();
  14.         
  15.         static myUnityContainer()
  16.         {
  17.             //配置关系
  18.             unityContainer.RegisterType<IUserDAL,NewDAL>();
  19.         }
  20.         
  21.         //得到容器
  22.         public static IUnityContainer GetUnity()
  23.         {
  24.             return unityContainer;
  25.         }
  26.     }
  27. }

然后在控制器中进行调用:

  1. using Microsoft.Practices.Unity;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Web;
  6. using System.Web.Mvc;
  7. using UntiyLearn.Interface;
  8. using UntiyLearn.Untiy;
  9. namespace UntiyLearn.Controllers
  10. {
  11.     public class HomeController : Controller
  12.     {
  13.         public ActionResult Index()
  14.         {
  15.             IUnityContainer unityContainer = myUnityContainer.GetUnity();
  16.             IUserDAL userDAL = unityContainer.Resolve<IUserDAL>();
  17.             ViewBag.user = userDAL.GetUser();
  18.             return View();
  19.         }
  20.         public ActionResult About()
  21.         {
  22.             IUnityContainer unityContainer = myUnityContainer.GetUnity();
  23.             IUserDAL userDAL = unityContainer.Resolve<IUserDAL>();
  24.             ViewBag.user = userDAL.GetUser();
  25.             return View();
  26.         }
  27.         public ActionResult Contact()
  28.         {
  29.             IUnityContainer unityContainer = myUnityContainer.GetUnity();
  30.             IUserDAL userDAL = unityContainer.Resolve<IUserDAL>();
  31.             ViewBag.user = userDAL.GetUser();
  32.             return View();
  33.         }
  34.     }
  35. }

运行效果:

首页:


关于:


联系方式:

显示的名字都是NewDAL中GetUser返回的贝贝,这时我们想要改成UserDAL中GetUser中返回的小明,这时我们只需要修改容器的配置步骤代码就好了,如下:

  1. //配置关系
  2. unityContainer.RegisterType<IUserDAL,UserDAL>();

现在我们再运行:

首先:


关于:


联系我们:

这时我们看到名字都变成了小明,节省了我们很多时间,不要去改很多代码,只需要改容器中的配置就好了,


你学会了吗?


评价

皮卡丘

2019/12/4 13:53:45

小哥哥真厉害[爱你][爱你][爱你]

IOC (控制反转 Dl (依赖注入

IOC:控制反转DI:注入依赖讲解:类与类之间的耦合性我们之间都是用NEW关键之直接实例化,这样耦合性很高,但是修改很麻烦今...

IOC控制反转和DI依赖注入

IOC控制反转 概念:把类与类的控制器交给容器就是控制反转 使用控制反转一般步骤: (1) 准备一个容器(创建一个类) ...

依赖注入控制反转(自己的理解

hello大家好今天要给大家分享的是自己对依赖注入和控制反转的理解 前面也有小伙伴们提到并做出了详细的讲解但是自己还是看...

IOC控制反转的形象比喻。AOP形象比喻

IOC控制反转的形象比喻通常情况下,假如你有一天在家里口渴了,要喝水,那么你可以到你小区的小卖部去,告诉他们,你需要一...

C ?、?? 问号和2个问号的用法(类型?、对象?

C# ?C# ???:单问号1.定义数据类型可为空。可用于对int,double,bool等无法直接赋值为null的数据类型进行null的赋值如这...

Python实例 1-日志抓取处理 补错(附日志小技巧

有时候数据出了问题,可以从日志中恢复数据(如果你没记日志..没备份..→_→..)一、日志展示介绍个平常自己用的小方法,如...

C 数组拆分(泛型

主要用到了泛型。泛型是c#2.0的一个新增加的特性,它为使用c#语言编写面向对象程序增加了极大的效力和灵活性。不会强行对值...

C网络流读取(图片

stringurl=&quot;....&quot;; Streamstream=WebRequest.Create(url).GetResponse().GetResponseStream(); constintbuffer...

MySQL 视图的(增删改 查

要显示视图的定义,需要在SHOWCREATEVIEW子句之后指定视图的名称, 我们先来创建几张表,完事后在进行演示:--用户信息表...

使用NPOI导出excel(包括图片

Excl模板导出相信我们都会,那么模板上要导出图片呢?嗯~还是来个例子:准备工作:首先要引用NPOI包:然后获取数据集(我这...

ajaxSubmit异步上传图片(嘘,外面都是假的

引用代码&lt;scriptsrc=&quot;/Scripts/jquery.form.js&quot;&gt;&lt;/script&gt;js就在旁边img链接中,只不过大小为0x0,...

.NET MVC 使用百度编辑器详细教程:(1配置编辑器

一、什么是百度编辑器百度编辑器UEditor是由百度web前端研发部开发一款应用于网站的编辑器,具有轻量,可定制,注重用户体...

使用jquery操作元素的css样式(获取、修改等等

使用jquery操作元素的css样式(获取、修改等等) //1、获取和设置样式 $(&quot;#tow&quot;).attr(&quot;class&quot;)...

.net辗转java系列(一视野

.net辗转java系列(一)视野.net系java系其它语言C#Java框架.net Framework Standardjava se.net corejava eejave meJava S...

.NET MVC json对象或者json对象数组的序列化和反序列化(一

1、用JSON.stringify()将对象stuarr或者json数组stuarr序列化成字符串,然后提交给后台。$.post(&quot;/home/DoUpdate&quot...
网络上你重拳出击,现实中你刚上初一
排名
27
文章
20
粉丝
11
评论
5
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
别紧张,我又不是什么好人。