首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Unity 3 依賴注入實戰:從三層架構邁向 IOC 容器管理

     編輯:關於.NET

前言

Unity 是 .NET 生態系中廣泛使用的 IoC 容器,最新版 Unity 3(NuGet 套件)提供程式碼與設定檔雙重註冊模式。本文以日期格式化介面為例,示範三種註冊解析方式與建構函式參數注入技巧。

環境與安裝

  • VS 2012 / .NET 4.5
  • NuGet 搜尋 Unity 安裝 Unity v3
  • NuGet 安裝 Unity 搜尋 Unity 管理方案套件

領域介面與實作

public interface IRegionFormat {
    string FormatName { get; }
    string GetShortTimeString(DateTime time);
}

public class DefaultRegionFormat : IRegionFormat {
    public string FormatName => "預設時間格式";
    public string GetShortTimeString(DateTime time) => time.ToString("yyyy-MM-dd");
}
public class DayMonthYearRegionFormat : IRegionFormat {
    public string FormatName => "日月年格式";
    public string GetShortTimeString(DateTime time) => time.ToString("dd/MM/yyyy");
}
public class MonthDayYearRegionFormat : IRegionFormat {
    public MonthDayYearRegionFormat(string s) { Console.WriteLine($"建構函式參數:{s}"); }
    public string FormatName => "月日年格式";
    public string GetShortTimeString(DateTime time) => time.ToString("MM/dd/yyyy");
}

三種註冊/解析模式

1. 純程式碼註冊

static IUnityContainer GetRegisterContainer() {
    var container = new UnityContainer();
    container.RegisterType<IRegionFormat, DefaultRegionFormat>();
    // 同介面重複註冊,後者生效
    return container;
}
static void NoConfigUnity() {
    var container = GetRegisterContainer();
    WriteFormat(container.Resolve<IRegionFormat>());
}

2. 設定檔驅動註冊

App.config

<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
  </configSections>
  <unity>
    <containers>
      <container name="defaultContainer">
        <register type="UnityDemo.IRegionFormat,UnityDemo" mapTo="UnityDemo.DefaultRegionFormat,UnityDemo" />
      </container>
      <container name="DayMonthYearContainer">
        <register type="UnityDemo.IRegionFormat,UnityDemo" mapTo="UnityDemo.DayMonthYearRegionFormat,UnityDemo" />
      </container>
      <container name="MonthDayYearContainer">
        <register type="UnityDemo.IRegionFormat,UnityDemo" mapTo="UnityDemo.MonthDayYearRegionFormat,UnityDemo" />
      </container>
    </containers>
  </unity>
</configuration>
static void ConfigUnity() {
    var container = new UnityContainer();
    var section = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
    section.Configure(container, "DayMonthYearContainer");
    WriteFormat(container.Resolve<IRegionFormat>());
}

3. 建構函式含參數注入

static void ParameterUnity() {
    var container = new UnityContainer();
    var section = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
    section.Configure(container, "MonthDayYearContainer");
    
    // 關鍵:為非註冊型別(string)註冊具體實例,供建構函式解析
    container.RegisterInstance(typeof(string), "string型別注入");
    
    WriteFormat(container.Resolve<IRegionFormat>());
}

執行結果

三種模式分別輸出對應格式名稱與當前時間,ParameterUnity 會顯示建構函式接收到的字串參數。

注意事項

  1. 建構函式參數未註冊型別:若實作類別建構函式包含非容器管理的型別(如 string, int),必須呼叫 RegisterInstance 提供具體值,否則解析拋異常。(object 型別參數例外,運行時不報錯但不建議)
  2. 設定檔區分大小寫:XML 節點與型別全名需完全一致。
  3. 官方文件:Unity 3 MSDN | CodePlex 專案

小結

Unity 3 靈活支援「純碼」、「設定檔」、「混合」三種模式,配合 RegisterInstance 解決基本型別注入難題,是從傳統三層架構引入 IOC 的平滑切入點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved