1. 程式人生 > >Unity依賴註入(筆記)

Unity依賴註入(筆記)

hone rac use nta () 一個 div idp one

一.介紹

控制反轉(Inversion of Control,英文縮寫為IoC):高層不直接依賴低層,轉移到第三方決定. 總結: 高層應該依賴抽象,抽象是穩定的,細節是多變的.

依賴註入(Dependency Injection,簡稱DI): Ioc 的實現方式.

二.Unity使用介紹

使用Nuget包安裝以下組件:

Unity : 5.8.6

Unity.Interception : 5.5.3

<!--Unity 配置文件-->
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
  </configSections>
  <unity>
    <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>
    <containers>
      <container name="testContainer">
        <register type="Interface.IPhone,Interface" mapTo="Services.AndroidPhone, Services" />
        <register type="Interface.IPhone,Interface" mapTo="Services.TestPhone, Services" name="TestPhone"/>
      </container>
    </containers>
  </unity>
</configuration>

  

<!--Unity 配置文件講解--> 
  <unity>
    <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>
    <containers>
      <container name="容器名稱">
        <register type="接口的命名空間(namespace).接口名,接口的命名空間" mapTo="實現類的命名空間.實現類名, 實現類名" />
        <register type="Interface.IPhone,Interface" mapTo="Services.TestPhone, Services" name="TestPhone"/>
      </container>
    </containers>
  </unity>
</configuration>

  

封裝UnityIocHelper調用類:

using System;
using System.Configuration;
using System.IO;
using Microsoft.Practices.Unity.Configuration;
using Unity;
using Unity.Resolution;

namespace MyIOC.Untiy
{
    /// <summary>
    /// 描 述:UnityIoc
    /// </summary>
    public class UnityIocHelper
    {
        
#region 構造方法 /// <summary> /// 構造方法 /// </summary> /// <param name="containerName">容器名稱</param> private UnityIocHelper(string containerName) { ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\\Unity.Config");//找配置文件的路徑 Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName); //UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); // <unity configSource="Config\ioc.config" /> if (section.Containers.Count > 0) { _container = new UnityContainer(); section.Configure(_container, containerName); } } #endregion #region 屬性 /// <summary> /// 容器 /// </summary> private readonly IUnityContainer _container; /// <summary> /// 容器實例 /// </summary> private static readonly UnityIocHelper instance = new UnityIocHelper("testContainer"); /// <summary> /// UnityIoc容器實例 /// </summary> public static UnityIocHelper Instance { get { return instance; } } #endregion #region 獲取對應接口的具體實現類 /// <summary> /// 獲取實現類(默認映射) /// </summary> /// <typeparam name="T">接口類型</typeparam> /// <returns>接口</returns> public T GetService<T>() { return _container.Resolve<T>(); } /// <summary> /// 獲取實現類(默認映射)帶參數的 /// </summary> /// <typeparam name="T">接口類型</typeparam> /// <param name="parameter">參數</param> /// <returns>接口</returns> public T GetService<T>(params ParameterOverride[] parameter) { return _container.Resolve<T>(parameter); } /// <summary> /// 獲取實現類(指定映射)帶參數的 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="name"></param> /// <param name="parameter"></param> /// <returns>接口</returns> public T GetService<T>(string name, params ParameterOverride[] parameter) { return _container.Resolve<T>(name, parameter); } #endregion #region 判斷接口是否被註冊了 /// <summary> /// 判斷接口是否被實現了 /// </summary> /// <typeparam name="T">接口類型</typeparam> /// <returns>bool</returns> public bool IsResolve<T>() { return _container.IsRegistered<T>(); } /// <summary> /// 判斷接口是否被實現了 /// </summary> /// <typeparam name="T">接口類型</typeparam> /// <param name="name">映射名稱</param> /// <returns></returns> public bool IsResolve<T>(string name) { return _container.IsRegistered<T>(name); } #endregion } }

調用示例:

var android = UnityIocHelper.Instance.GetService<IPhone>();//不帶參數,默認取容器的沒用name的,但只能有一個,不然會異常.
    android.Call();//AndroidPhone

var android = UnityIocHelper.Instance.GetService<IPhone>("TestPhone"); //取容器內名稱匹配的.
android.Call();//TestPhone


三.Unity實現AOP

<!--Unity 配置文件-->
<container name="ContainerAOP">
      <extension type="Interception"/>
      <register type="Interface.IPhone,Interface" mapTo="Services.AndroidPhone, Services">
          <interceptor type="InterfaceInterceptor"/>
          <interceptionBehavior type="AOP.LogAfterBehavior,AOP"/>
          <interceptionBehavior type="AOP.LogBeforeBehavior,AOP"/> 
       </register>
 </container>

  

調用示例:

  var androidAOP = UnityIocHelper.AOPInstance.GetService<IPhone>();//跟普通調用一樣.
            androidAOP.Call();

四.源碼下載:

https://github.com/gyw1309631798/MyIOC

Unity依賴註入(筆記)