IOC:英文全稱:Inversion of Control,中文名稱:控制反轉,它還有個名字叫依賴注入(Dependency Injection)。
做用:將各層的對象以鬆耦合的方式組織在一塊兒,解耦,各層對象的調用徹底面向接口。當系統重構的時候,代碼的改寫量將大大減小。
依賴注入: 當一個類的實例須要另外一個類的實例協助時,在傳統的程序設計過程當中,一般有調用者來建立被調用者的實例。然而採用依賴注入的方式,建立被調用者的工做再也不由調用者來完成,所以叫控制反轉,建立被調用者的實例的工做由IOC容器來完成,而後注入調用者,所以也稱爲依賴注入。html
Unity是微軟Patterns & Practices團隊所開發的一個輕量級的,而且可擴展的依賴注入(Dependency Injection)容器;git
它支持經常使用的三種依賴注入方式:構造器注入(Constructor Injection)、屬性注入(Property Injection),以及方法調用注入(Method Call Injection)。github
如今Unity最新的版本的4.0版,能夠在微軟的開源站點 https://github.com/unitycontainer/unity 下載最新的發佈版本。web
經過使用Unity,咱們能輕鬆構建鬆耦合結構的程序,從而讓整個程序框架變得清晰和易於維護。mvc
建立一個mvc5項目 Web.Mvc,而後在建立一個Business類庫,將類庫添加引用到Web.Mvc項目.app
類庫代碼框架
a、Business類庫定義一個接口IUserServiceui
namespace Business
{
/// <summary>
/// 顯示信息
/// </summary>
public interface IUserService { string Display(string mes); } }
b、Business類庫實現接口this
namespace Business
{
public class UserService : IUserService { /// <summary> /// 顯示信息 /// </summary> /// <param name="mes"></param> public string Display(string mes) { return "I say:" + mes; } } }
在Web.Mvc項目經過nuget添加unity.mvc5 (1.2.3)spa
1.註冊服務
註冊依賴使用依賴注入生效,在Web.Mvc項目的Global.asax進行註冊
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; using Business; using Microsoft.Practices.Unity; using Unity.Mvc5; namespace Web.Mvc { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //注入 Ioc var container = this.BuildUnityContainer(); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); } IUnityContainer BuildUnityContainer() { var container = new UnityContainer(); container.RegisterType<IUserService, UserService>(); return container; } } }
2.注入服務
namespace Web.Mvc.Controllers { public class HomeController : Controller { private IUserService userService; public HomeController(IUserService userService) { this.userService = userService; } public ActionResult Index() { ViewBag.Msg = userService.Display("hahaha"); return View(); } } }
e、在Index.cshtml找個地方寫入@ViewBag.Msg 就能夠,如
<h1>ASP.NET - @ViewBag.Msg</h1>
最後運行項目,實現效果
本示例爲2017.12.08補充。
建立一個mvc5項目 Web.Mvc,而後在建立一個Business類庫,將類庫添加引用到Web.Mvc項目,在Web.Mvc項目經過nuget添加unity.mvc5 (1.3.0)
命令:Install-Package Unity.Mvc5 -Version 1.3.0
安裝後如圖
1. 調用註冊組件
在Global.asax.cs 的Application_Start 方法添加 UnityConfig.RegisterComponents() ,MVC會使用 Unity.Mvc5的 DependencyResolver去解析服務
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); UnityConfig.RegisterComponents();//在此處添加 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); }
2.註冊服務
找到App_Start下的UnityConfig類,以下修改
public static class UnityConfig { public static void RegisterComponents() { var container = new UnityContainer(); //在這裏使用container註冊全部服務 container.RegisterType<IUserService, UserService>();//自定義的服務 DependencyResolver.SetResolver(new UnityDependencyResolver(container)); } }
3.修改控制器Home和頁面Index
public class HomeController : Controller { private IUserService userService; public HomeController(IUserService userService) { this.userService = userService; } public ActionResult Index() { ViewBag.Name = userService.Display("我是 UNITY 1.3.0"); return View(); }
頁面代碼
<div class="jumbotron"> <h1>Unity 入門</h1> <p class="lead">@ViewBag.Name</p> </div>
效果
對示例一 的註冊進行獨立封裝到BootStrapper中
c、註冊依賴使用依賴注入生效
在Web.Mvc項目的Global.asax進行註冊
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; using Business; using Microsoft.Practices.Unity; using Unity.Mvc5; namespace Web.Mvc { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //注入 Ioc BootStrapper.Initialise(); } } }
BootStrapper代碼
using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Web; using System.Web.Mvc; using Business; using Microsoft.Practices.Unity; using Microsoft.Practices.Unity.Configuration; using Unity.Mvc5; namespace Web.Mvc { public class BootStrapper { /// <summary> /// 獲取容器-註冊依賴關係 /// </summary> /// <returns></returns> public static IUnityContainer Initialise() { var container = BulidUnityContainer(); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); return container; } /// <summary> /// 加載容器 /// </summary> /// <returns></returns> private static IUnityContainer BulidUnityContainer() { var container = new UnityContainer(); RegisterTypes(container); return container; } /// <summary> /// 實施依賴注入 /// </summary> /// <param name="container"></param> private static void RegisterTypes(IUnityContainer container) { //類型的配置容器註冊 container.RegisterType<IUserService, UserService>(); //container.RegisterType<IUserService, UserService>(new ContainerControlledLifetimeManager());//經過生命週期實現了單例模式 //已有對象實例的配置容器註冊,也爲單例 //UserService userService = new UserService(); //container.RegisterInstance<IUserService>(userService); } } }
修改上面的方法,將註冊放到配置文件中
1.方法修改
/// <summary> /// 實施依賴注入 /// </summary> /// <param name="container"></param> private static void RegisterTypes(IUnityContainer container) { ////依賴關係能夠選擇代碼形式,也能夠用配置文件的形式 UnityConfigurationSection config = (UnityConfigurationSection)ConfigurationManager.GetSection(UnityConfigurationSection.SectionName); config.Configure(container, "defaultContainer"); }
UnityConfigurationSection.SectionName爲unity
2.配置文件
提示:自定義web.config節點來實現
<configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/> <!-- 通常將unity節點放到文件末尾 --> </configSections> <unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> <namespace name="Business" /> <assembly name="Business" /> <containers> <container name="defaultContainer"> <register type="IUserService" mapTo="UserService"> <lifetime type="singleton" /> </register> <register type="ILocalUserService" mapTo="LocalUserService"/> </container> </containers> </unity> </configuration>
或者爲
直接指定命名空間
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> <assembly name="Business" /> <containers> <container name="defaultContainer"> <register type="Business.IUserService" mapTo="Business.UserService"> <lifetime type="singleton" /> </register> <register type="Business.ILocalUserService" mapTo="Business.LocalUserService"/> </container> </containers> </unity>
或者爲
指定程序集名稱
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> <containers> <container name="defaultContainer"> <register type="Business.IUserService,Business" mapTo="Business.UserService,Business"> <lifetime type="singleton" /> </register> <register type="Business.ILocalUserService,Business" mapTo="Business.LocalUserService,Business"/> </container> </containers> </unity>
源碼下載:https://gitee.com/zmsofts/XinCunShanNianDaiMa/blob/master/IocDemo.rar
參考網址:
http://www.cnblogs.com/zhangchenliang/archive/2013/01/08/2850970.html
https://www.lanhusoft.com/Article/108.html
http://blog.csdn.net/xingxing513234072/article/details/21176247
http://www.cnblogs.com/wwj1992/p/6728370.html
http://www.cnblogs.com/xishuai/p/3670292.html(推薦)