Unity依赖注入

   控制反转 是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection, DI), 还有一种叫"依赖查找"(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

安装

工具 -> 库程序包管理器 -> 程序包管理器控制台

输入下面命令

install-package Unity -Version 5.5.0

install-package Unity.Mvc -Version 5.0.11

1、添加一个接口和一个实现类

    public interface IMsg
    {
        void Display(string mes);
    }
    public class Msg : IMsg
    {
        public void Display(string mes)
        {
            Console.WriteLine("执行");
        }
    }
  public class User
  {
        public IMsg _msg;
        public User(IMsg msg)
        {
            _msg = msg;
        }
        public void Display(string mes)
        {
            _msg.Display(mes);
        }
  }

 

2、新建 Bootstrapper.cs文件

    public class BootStrapper
    {
        /// <summary>
        /// 获取容器-注册依赖关系
        /// </summary>
        /// <returns></returns>
        public static IUnityContainer Initialise()
        {
            var container = BuildUnityContainer();
            DependencyResolver.SetResolver(new UnityDependencyResolver(container));
            return container;
        }

        /// <summary>
        /// 加载容器
        /// </summary>
        /// <returns></returns>
        private static IUnityContainer BuildUnityContainer()
        {
            var container = new UnityContainer();
            RegisterTypes(container);
            return container;
        }

        /// <summary>
        /// 实施依赖注入
        /// </summary>
        /// <param name="container"></param>
        private static void RegisterTypes(UnityContainer container)
        {
            //1.通过反射获取当前程序集中的所以类
            var types = Assembly.GetExecutingAssembly().GetTypes();
            foreach (var row in types)
            {
                //2.查找出所有实现了接口的实现类 和 接口 进行配对注册依赖对象
                var isIsInterface = row.IsInterface;
                var interfaces = row.GetInterfaces();
                if (!isIsInterface && interfaces.Length > 0)
                {
                    //注册依赖对象
                    container.RegisterType(interfaces[0], row);
                }
            }
        }
    }

 

3、Global.aspx.cs添加依赖注入代码

    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            //加载容器-注册依赖
            BootStrapper.Initialise();
        }
    }

 

4、控制器UsersController.cs调用

public class HomeController : Controller
    {
        private readonly IUser _user;
     //构造函数注入
        public HomeController(IUser user)
        {
            _user = user;
        }

        public ActionResult Index()
        {
            _user.Display("开箱");
            return View();
        }
    }

 

posted on 2017-12-26 16:45  敏俫  阅读(384)  评论(0编辑  收藏  举报