使用Unity容器實現屬性注入


簡介

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>();

這樣就獲取到了容器里面的內容。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM