簡介
Unity :是微軟用C#實現的輕量級,可擴展的依賴注入容器。
控制反轉:(Inversion of Control,縮寫為IoC),是用來消減程序之間的耦合問題,把程序中上層對下層依賴,轉移到一個第三方容器中來裝配。
依賴注入:(Dependency Injection,縮寫為DI):我們向容器發出請求以后,獲得這個對象實例的過程就叫依賴注入。
實現
使用NuGet程序包添加引用:
輸入Unity.Configuration搜索並下載會自動添加所需的包(Unity.Container,System.Runtime.CompilerServices.Unsafe,Unity.Abstractions)
配置文件如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!--定義配置節處理程序與配置元素之間的關聯。--> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Unity.Configuration" /> </configSections> <unity> <containers> <container> <!--type為對象的名稱,mapTo為注入對象的名稱 寫法為用逗號隔開兩部分,一是類的全部,包括命名空間,二是程序集名稱--> <register type="YK.Interface.IPms,YK.Interface" mapTo="YK.Pms.Xlp.BJAiTe,YK.Pms.Xlp.BJAiTe"> <lifetime type="singleton" /> <!--Api接口--> <property name="Url" value="*****"></property> <!--用戶名--> <property name="UserName" value="*****" /> <!--密碼--> <property name="UserPassword" value="*****"/> </register> </container> </containers> </unity> </configuration>
配置文件初始化:
var configFileNames = Directory.GetFiles(@"D:\YKConfig", "*.config"); if (configFileNames.Length != 1) { MessageBox.Show($@"D:\YKConfig文件夾里面必須只能一個配置文件,現在有{configFileNames.Length}個"); return; } var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = configFileNames[0] }; //從config文件中讀取配置信息 var configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); //獲取指定名稱的配置節 var section = (UnityConfigurationSection)configuration.GetSection("unity"); //創建容器 var _Uc = new UnityContainer(); //載入容器 section.Configure(_Uc);
在VMMainWindow里添加公共成員,並用 [Dependency]在上方標記:
[Dependency] public IPms Pms { get; set; }
用RegisterSingleton去注冊:
_Uc.RegisterSingleton<VMMainWindow>();
最后使用Resolve去解析:
var vmMain = UC.Resolve<VMMainWindow>();
這樣就獲取到了容器里面的內容。