Unity 開發和配置


概述

Unity是一個輕量級的可擴展的依賴注入容器,支持構造函數,屬性和方法調用注入。Unity可以處理那些從事基於組件的軟件工程的開發人員所面對的問題。構建一個成功應用程序的關鍵是實現非常松散的耦合設計。松散耦合的應用程序更靈活,更易於維護。這樣的程序也更容易在開發期間進行測試。你可以模擬對象,具有較強的具體依賴關系的墊片(輕量級模擬實現),如數據庫連接,網絡連接,ERP連接,和豐富的用戶界面組件。例如,處理客戶信息的對象可能依賴於其他對象訪問的數據存儲,驗證信息,並檢查該用戶是否被授權執行更新。依賴注入技術,可確保客戶類正確實例化和填充所有這些對象,尤其是在依賴可能是抽象的 。

Unity 配置文件的完整格式

<?xml version="1.0" encoding="utf-8" ?> 
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration, Version=1.0.0.0,Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</configSections>

<unity>
<typeAliases>
    <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,Microsoft.Practices.Unity" />
    <typeAlias alias="external" type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager, Microsoft.Practices.Unity" />
    <typeAlias alias="IMyInterface" type="MyApplication.MyTypes.MyInterface, MyApplication.MyTypes" />
    <typeAlias alias="MyRealObject" type="MyApplication.MyTypes.MyRealObject, MyApplication.MyTypes" />
    <typeAlias alias="IMyService" type="MyApplication.MyTypes.MyService, MyApplication.MyTypes" />
    <typeAlias alias="MyDataService" type="MyApplication.MyTypes.MyDataService, MyApplication.MyTypes" />
    <typeAlias alias="MyCustomLifetime" type="MyApplication.MyLifetimeManager, MyApplication.MyTypes" />
</typeAliases>

<containers>
    <container name="containerOne">
      <types>
        <type type="Custom.MyBaseClass" mapTo="Custom.MyConcreteClass" />
        <type type="IMyInterface" mapTo="MyRealObject" name="MyMapping" />
        <type type="Custom.MyBaseClass" mapTo="Custom.MyConcreteClass">
          <lifetime type="singleton" /> 
        </type>
        <type type="IMyInterface" mapTo="MyRealObject" name="RealObject">
          <lifetime type="external" />
        </type>
        <type type="Custom.MyBaseClass" mapTo="Custom.MyConcreteClass">
          <lifetime value="sessionKey" type="MyApplication.MyTypes.MyLifetimeManager,MyApplication.MyTypes" />
        </type>
        <type type="IMyInterface" mapTo="MyRealObject" name="CustomSession">
          <lifetime type="MyCustomLifetime" value="ReverseKey" typeConverter="MyApplication.MyTypes.MyTypeConverter,MyApplication.MyTypes" />
        </type>
        <type type="IMyService" mapTo="MyDataService" name="DataService">
          <typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement, Microsoft.Practices.Unity.Configuration">
            <constructor>
              <param name="connectionString" parameterType="string">
                <value value="AdventureWorks"/>
              </param>
              <param name="logger" parameterType="ILogger">
                <dependency />
              </param>    (車延祿)
            </constructor> 
            <property name="Logger" propertyType="ILogger" />
            <method name="Initialize">
              <param name="connectionString" parameterType="string">
                <value value="contoso"/>
              </param>
              <param name="dataService" parameterType="IMyService">
                <dependency />
              </param>
            </method>
          </typeConfig>
        </type>
      </types>

      <instances>
        <add name="MyInstance1" type="System.String" value="Some value" />
        <add name="MyInstance2" type="System.DateTime" value="2008-02-05T17:50:00" />
      </instances>

      <extensions>
        <add type="MyApp.MyExtensions.SpecialOne" />
      </extensions>

      <extensionConfig>
        <add name="MyExtensionConfigHandler" type="MyApp.MyExtensions.SpecialOne.ConfigHandler" />
      </extensionConfig>
    </container>
</containers>
</unity>
</configuration>

 

 

unity的設計圖

 

2

 

 

Unity的配置節的名稱為”Unity",節處理程序的類型為 Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,它包含在程序集 Microsoft.Practices.Unity.Configuration 中。所在應當在網站是添加該程序集的引用。

unity 的子元素包含了一個 containers 元素,containers 元素可以包含若干個 container 元素。container 元素就是每個容器的配置,它有一個可選的 name 屬性,用於指定容器的名稱。

<types> 元素是 container 元素的子元素之一。包含任意數量的 type元素,用以添加類型注冊,這些配置被container.RegisterType<TFrom,TTo>()注冊;
type元素的屬性。
name:在注冊此類型時使用的名稱。此屬性是可選的,如果不指定此屬性,所在的 add 元素即為默認的類型映射。
type:容器中配置的源類型。如果這是映射注冊,這就是映射的起始對象的類型;如果這是單件注冊,這就是對象的類型。此屬性是必須的。
mapTo:類型映射的目標類型。如果這是映射注冊,這就是映射的目標對象的類型。此屬性是可選的。
lifetime:設置用於給定的類型和名稱的生命周期。是一個來自 LifetimeStyle 枚舉的值。有效的值是 Transient(默認),它導致了容器每次都創建一個新的實例;以及 Singleton,它使容器為每個請求返回同一實例。如果在配置一個單件時同時指定了 type 和 mapto 屬性,SetSingleton 方法將返回指定在 mapTo 屬性中的類型。如果 mapTo 屬性沒有指定值,SetSingleton 方法將返回指定在 type 屬性中的類型。

<instances> 元素保持了用於此容器的已有對象實例的列表。這些對象被用容器的 RegisterInstance 方法進行注冊。instances 元素包含了一系列添加單個實例的 add 元素。
add 元素的屬性。
name:注冊此實例時使用的名稱。此屬性是可選的。
type:此實例的類型。此屬性是可選的。如果忽略,假定的類型是 System.String。
value:用於初始化實例的值。此屬性是必須的。
typeConverter:用以轉換提供的值到實例的匹配類型的類型轉換器。如果沒有指定,將使用指定類型的默認轉換器。此屬性是可選的。

<typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement,Microsoft.Practices.Unity.Configuration">
用來配置在類型注冊時,構造函數依賴注入,屬性依賴注入和方法依賴注入時的對象初始化信息。
它包含以下幾個子元素:

<constructor>
    <param name="connectionString" parameterType="string">
        <value value="AdventureWorks"/>
    </param>
    <param name="logger" parameterType="ILogger">
        <dependency />
    </param>
</constructor> 
<property name="Logger" propertyType="ILogger" />
<method name="Initialize">
    <param name="connectionString" parameterType="string">
        <value value="contoso"/>
    </param>
    <param name="dataService" parameterType="IMyService">
        <dependency />
    </param>
</method>

 

 

 

在執行Container.Resolve()生成對象實例的時候,會根據上面的配置信息的內容對要生成的對象進行依賴注入。

二、加載配置信息到容器中
1、加載一個單獨的未命名容器或規定了默認容器:
IUnityContainer container = new UnityContainer();
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Containers.Default.Configure(container);
這樣就會根據配置文件中的配置信息,在UnityContainer容器中注冊類型映射

2、加載一個特殊命名容器的配置信息,需要使用定義在配置文件中的容器名,而不是引用默認容器。例如,如果在配置中有一個命名為containerOne的容器,能使用如下代碼初始化並加載它:
IUnityContainer container = new UnityContainer();
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Containers["containerOne"].Configure(container);

3、為了從配置信息中創建一個嵌套容器繼承, 可以簡單的使用CreateChildContainer方法在你需要的繼承深度中創建容器對象,然后通過讀取各自的配置文件加載合適的配置。下面的代碼展示了如何從配置文件中實例化和加載兩個容器,這個配置文件同時包含了針對兩個命名為containerOne和newstedChildContainer容器的注冊信息,類型映射和擴展定義。
IUnityContainer parentContainer = new UnityContainer();
IUnityContainer childContainer = parentContainer.CreateChildContainer();
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Containers["containerOne"].GetConfigCommand().Configure(parentContainer);
section.Containers["nestedChildContainer"].Configure(childContainer);

 

 

API

UnityContainer.RegisterType<ITFrom,TTO>();

UnityContainer.RegisterType< ITFrom, TTO >();

UnityContainer.RegisterType< ITFrom, TTO >("keyName");

IEnumerable<T> databases = UnityContainer.ResolveAll<T>();

IT instance = UnityContainer.Resolve<IT>();

T instance = UnityContainer.Resolve<T>("keyName");

UnitContainer.RegisterInstance<T>("keyName",new T());

UnityContainer.BuildUp(existingInstance);

IUnityContainer childContainer1 = parentContainer.CreateChildContainer();

示例

 public abstract class SQLHelp
    {
        public abstract string SqlConnection();
    }

    public class MySqlHelp:SQLHelp
    {

        public override string SqlConnection()
        {
            return "my sql connection";
        }
    }

    public class MSSqlHelp : SQLHelp
    {

        public override string SqlConnection()
        {
            return "ms sql connection";
        }
    }
    public class OracleSqlHelp : SQLHelp
    {

        public override string SqlConnection()
        {
            return "oracle sql connection";
        }
    }

 

 

 

app.config配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
  <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <container>
      <register type="SqlHelp, New_Code"   mapTo="MySqlHelp, New_Code">
        <lifetime type="singleton"/>
      </register>
      
    </container>
  </unity>
</configuration>

 

 

實現代碼

       public void Main()
       {
           IUnityContainer container = new UnityContainer();
           UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
           section.Containers.Default.Configure(container);

           SQLHelp sqlHelp = container.Resolve<SQLHelp>();
           Console.WriteLine(sqlHelp.SqlConnection());
       }

 

 

運行結果:

my sql connection

 

歡迎各位參與討論,如果覺得對你有幫助,請點擊image    推薦下,萬分謝謝.

作者:spring yang

出處:http://www.cnblogs.com/springyangwc/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

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



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