.Net IOC框架入門之一 Unity

1、概述

  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

2、簡單示例

  建立一個mvc5項目 Web.Mvc,而後在建立一個Business類庫,將類庫添加引用到Web.Mvc項目.app

Business類庫

  類庫代碼框架

  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>

最後運行項目,實現效果

ASP.NET - I say:hahaha

示例二

  本示例爲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>
 

效果

 

3、註冊封裝

對示例一 的註冊進行獨立封裝到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);

        }
    }
}

Unity註冊配置

 修改上面的方法,將註冊放到配置文件中

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(推薦)

相關文章
相關標籤/搜索