面對對象設計原則能夠幫助咱們開發出更好的程序,其中有一個依賴倒置原則DIP並由此引伸出IOC、DI等概念。就先粗略的瞭解一下:html
總的來講控制反轉(IoC)是依賴倒置原則(DIP)的實現思路;依賴注入(DI)又是IoC的一種實現方式。編程
Unity容器(Unity)是一個輕量級,可擴展的依賴注入容器。它有助於構建鬆散耦合的應用程序,併爲開發人員提供如下優點:緩存
關於Unity替換.Net Core原聲DI我發如今網上的中文資料基本沒有,因此我在Unity的Gitbub上找到了相關的內容,但願能夠給你們帶來幫助。app
個人是.Net Core2.2首先須要經過Nuget引入Unity(5.10.2)和Unity.Microsoft.DependencyInjection(5.10.1)這裏須要注意版本,我原先Unity引用5.10.3的就運行報錯了。ide
在Program.cs文件中的CreateWebHostBuilder中添加UseUnityServiceProvider()方法便可替換.Net Core的原生DI容器,具體以下:函數
private static IUnityContainer _container; public static void Main(string[] args) { _container = new UnityContainer(); ConfigureContainer(_container); CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseUnityServiceProvider(_container) .UseStartup<Startup>(); public static void ConfigureContainer(IUnityContainer _container) { //註冊對象關係 }
一、代碼實現測試
使用代碼主要分爲如下兩步:ui
IUnityContainer _container = new UnityContainer(); _container.RegisterType<IPhone, NubiaPhone>(); _container.RegisterType<IPhone, MiPhone>("Mi"); _container.RegisterType<IEarPhone, NubiaEarPhone>();
二、使用配置文件spa
使用配置文件須要引用Unity.Configuration,因爲項目龐大的狀況下配置文件會變得不少,因此我這裏單獨拿出來一個文件進行配置。主要分爲如下三步:設計
配置文件以下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/> </configSections> <unity> <typeAliases> <typeAlias alias="IEarPhone" type="Xu.UnityDemo.Interface.IEarPhone,Xu.UnityDemo" /> <typeAlias alias="IPhone" type="Xu.UnityDemo.Interface.IPhone,Xu.UnityDemo" /> <typeAlias alias="NubiaPhone" type="Xu.UnityDemo.Model.NubiaPhone,Xu.UnityDemo" /> <typeAlias alias="MiPhone" type="Xu.UnityDemo.Model.MiPhone,Xu.UnityDemo" /> <typeAlias alias="NubiaEarPhone" type="Xu.UnityDemo.Model.NubiaEarPhone,Xu.UnityDemo" /> <typeAlias alias="MiEarPhone" type="Xu.UnityDemo.Model.MiEarPhone,Xu.UnityDemo" /> </typeAliases> <containers> <container name="IOCcontainer"> <type type="IPhone" mapTo="MiPhone" name="Mi"></type > <type type="IPhone" mapTo="NubiaPhone"></type > <type type="IEarPhone" mapTo="NubiaEarPhone"></type > </container> </containers> </unity> </configuration>
主要用到兩個節點<typeAlias>和<type>。<typeAlias>節點的alias是別名在<type>節點中的type使用,type是「命名空間+對象名,所在程序集名稱」。<type>節點的type是「須要映射的對象」mapTo是「映射的目標對象」name是「標識名」在多個類繼承同個接口的時候區分使用。其他的節點如圖Unity配置文件節點圖。
代碼以下:
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); fileMap.ExeConfigFilename = Directory.GetCurrentDirectory() + "/Config/UnityIocConfig.xml"; Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName); //獲取特定配置節下已命名的配置節<container name="IOCcontainer">下的配置信息 section.Configure(_container, "IOCcontainer");
一、構造函數注入
構造函數注入是最經常使用的一種注入方式,以下:
private IPhone _iPhone; private IUnityContainer _container; public ValuesController(IUnityContainer container, IPhone iPhone) { _container = container; _iPhone = iPhone; }
此處我在ValuesController控制器寫了一個構造函數,container注入的對象就是在UseUnityServiceProvider()方法中傳入的Unity容器對象,咱們經過Resolve<T>()方法能夠直接使用。iPhone也會被注入NubiaPhone類。固然也能夠在別的類中使用以下:
[InjectionConstructor] public NubiaPhone(IEarPhone earPhone) { earPhone.Color = "blue"; }
當存在多個構造函數的時候,若是有[InjectionConstructor]特性標記則使用此構造函數,不然選擇參數最多的那個。
二、屬性注入
屬性注入須要在屬性上標記[Dependency]特性,[Dependency]能夠指定一個name標識名來指定注入屬性的具體對象。
[Dependency("name")] public IEarPhone _iEarPhone { set; get; }
3.方法注入
方法注入須要標記[InjectionMethod]特性,使用和構造函數注入類似。
[InjectionMethod] public void Init(IEarPhone iEarPhone) { _iEarPhone = iEarPhone; }
不少內容我沒有細講,由於不少東西內容都在園中能夠找到,我主要是爲了解決Unity替換Net Core原生DI的問題。但願你們有問題能夠交流共勉。個人測試代碼。