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

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

耦合性

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

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

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

UserDAL userDAL = new UserDAL();

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

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

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

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

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

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

创建一个接口(IUserDAL)

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UntiyLearn.Interface
{
    public interface IUserDAL
    {
        string GetUser();
    }
}

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

代码如下:

NewDAL

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UntiyLearn.Interface;

namespace NET58_DAL
{
    public class NewDAL:IUserDAL
    {
        public string GetUser()
        {
            return "贝贝";
        }
    }
}

UserDAL

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UntiyLearn.Interface;

namespace NET58_DAL
{
    public class UserDAL:IUserDAL
    {
        public string GetUser()
        {
            return "小明";
        }
    }
}

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

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.Practices.Unity;
using NET58_DAL;
using UntiyLearn.Interface;
namespace UntiyLearn.Untiy
{
    public class myUnityContainer
    {
          //创建容器
        static IUnityContainer unityContainer = new UnityContainer();
        
        static myUnityContainer()
        {
            //配置关系
            unityContainer.RegisterType<IUserDAL,NewDAL>();
        }
        
        //得到容器
        public static IUnityContainer GetUnity()
        {
            return unityContainer;
        }
    }
}

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

using Microsoft.Practices.Unity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using UntiyLearn.Interface;
using UntiyLearn.Untiy;
namespace UntiyLearn.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            IUnityContainer unityContainer = myUnityContainer.GetUnity();
            IUserDAL userDAL = unityContainer.Resolve<IUserDAL>();
            ViewBag.user = userDAL.GetUser();
            return View();
        }
        public ActionResult About()
        {
            IUnityContainer unityContainer = myUnityContainer.GetUnity();
            IUserDAL userDAL = unityContainer.Resolve<IUserDAL>();
            ViewBag.user = userDAL.GetUser();
            return View();
        }
        public ActionResult Contact()
        {
            IUnityContainer unityContainer = myUnityContainer.GetUnity();
            IUserDAL userDAL = unityContainer.Resolve<IUserDAL>();
            ViewBag.user = userDAL.GetUser();
            return View();
        }
    }
}

运行效果:

首页:
在这里插入图片描述
关于:
在这里插入图片描述
联系方式:
在这里插入图片描述

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

//配置关系
unityContainer.RegisterType<IUserDAL,UserDAL>();
现在我们再运行:

首先:
在这里插入图片描述
关于:
在这里插入图片描述
联系我们:

在这里插入图片描述

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

你学会了吗?


版权声明:本文为weixin_45754664原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。