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(); } }