Unity依賴註入(筆記)
阿新 • • 發佈:2019-02-26
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依賴註入(筆記)