C# Unity使用

1.引用對象

2.在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  configSource="unity.config" />
    
   
</configuration>

這裡unity的配置是在unity.config中進行配置的。

代碼如下:

View Code
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
  <!--alias 定義別名-->
  <alias alias="IClass" type="ConsoleApplication1.IClass, ConsoleApplication1" />
  <alias alias="MyClass" type="ConsoleApplication1.MyClass, ConsoleApplication1" />
  <!--引入下面的命名空間,可以省的輸入過多的內容-->
  <namespace name="ConsoleApplication1" />
  <assembly name="ConsoleApplication1" />
  
  <container >
    <register type="IClass" mapTo="MyClass" />
    <register type="ILogger" mapTo="FileLogger"></register>
    
    <!--註冊類+構造函數 默認數值是3-->
    <register type="InstallerBase" mapTo="BlogInstaller">
      <constructor>
        <param name="pubContext" type="IPubContext" />
        <param name="sum" type="System.Int32" value="3" />
      </constructor>
    </register>

    <!--<register type="ISomeInterface[]" mapTo="MyTypeImplementingSomeInterface[]"/>-->
    <register type="ISomeInterface[System.Int32]" mapTo="MyTypeImplementingSomeInterface[System.Int32]"/>

    
    <register type="ObjectWithOverloads" name="callFirstOverload">
      <method name="CallMe">
        <param name="param" type="int" value="17"/>
      </method>
    </register>

    <register type="ILogger" mapTo="MockLogger" name="validLogger" />
    <register type="ObjectUsingLogger" name="dependencyRegistered">
      <property name="Logger">
        <optional name="validLogger" />
      </property>
    </register>
    <!--數值-->
    <register type="ILogger" name="main" mapTo="MockLogger" />
    <register type="ILogger" name="another" mapTo="MockLogger" />
    <register type="ILogger" name="special" mapTo="SpecialLogger" />
    <register type="ArrayDependencyObject" name="specificElements">
      <property name="Loggers">
        <array>
          <dependency name="main" />
          <dependency name="another" />
        </array>
      </property>
    </register>
  </container>
  
</unity>

3.關於配置的說明

  <!--alias 定義別名-->
  <alias alias="IClass" type="ConsoleApplication1.IClass, ConsoleApplication1" />

  <!--引入下面的命名空間,可以省的輸入過多的內容-->
  <namespace name="ConsoleApplication1" />

2個操作是為了使輸入簡單。

4.實例說明

4.1 定義UnityContainer,并初始化用配置文件中的數據

            var container = new UnityContainer();

            UnityConfigurationSection configuration = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
         
            configuration.Configure(container);

 

4.2 註冊簡單接口類

 <register type="IClass" mapTo="MyClass" />

代碼如下:

    interface IClass
    {
        void ShowInfo();
    }
class MyClass:IClass
    {
        [Dependency]//實例化對象
        public virtual IPubContext Context { set; get; }
        #region IClass 成員

        public void ShowInfo()
        {
            Console.WriteLine("MyClass12");
        }

        #endregion
    }

代碼中調用:

 IClass classInfo = container.Resolve<IClass>();
classInfo.ShowInfo();

4.3 如果對象中有屬性,需要初始化,可以在屬性上加[Dependency]//實例化對象,那麼在取得對象的時候,這個屬性頁初始化了。

如上例中的IPubContext 屬性。

    class IPubContext
    {
        public string Name { set; get; }
    }

4.4 帶構造函數的實例配置

    <register type="InstallerBase" mapTo="BlogInstaller">
      <constructor>
        <param name="pubContext" type="IPubContext" />
        <param name="sum" type="System.Int32" value="3" />
      </constructor>
    </register>

定義類型如下:

View Code
   class BlogInstaller : InstallerBase
    {
        private IPubContext pubContext;
        private int sum;
        public BlogInstaller(IPubContext pubContext,int sum)
        {
            this.pubContext = pubContext;
        }

        #region InstallerBase 成員

        public void ShowInfo()
        {
            Console.WriteLine("FileLogger12InstallerBase");
        }

        #endregion
    }

    interface InstallerBase
    {
        void ShowInfo();
    }

代碼調用如下:

 InstallerBase classInstallerBase = container.Resolve<InstallerBase>();
 classInstallerBase.ShowInfo();

其中,構造函數是:

        public BlogInstaller(IPubContext pubContext,int sum)
        {
            this.pubContext = pubContext;
        }

與配置文件中的參數是一一對應的。並且配置文件中對與sum這個屬性,有默認數值是3.

4.5 泛型類型配置

<register type="ISomeInterface[]" mapTo="MyTypeImplementingSomeInterface[]"/>

代碼如下定義:

View Code
    public interface ISomeInterface<T>
    {

    }

    public class MyTypeImplementingSomeInterface<T> : ISomeInterface<T>
    {

    }

代碼調用如下:

ISomeInterface<int> some = container.Resolve<ISomeInterface<int>>();

4.6 配置方法的執行

   <register type="ObjectWithOverloads" name="callFirstOverload">
      <method name="CallMe">
        <param name="param" type="int" value="17"/>
      </method>
    </register>

定義類callFirstOverload,並且定義方法CallMe

View Code
    /// <summary>
    /// 執行方法
    /// </summary>
    class ObjectWithOverloads
    {
        public int FirstOverloadCalls;
        public int SecondOverloadCalls;


        public void CallMe(int param)
        {
            ++FirstOverloadCalls;
        }

        public void CallMe(string param)
        {
            ++SecondOverloadCalls;
        }
    }

代碼調用:

    //執行方法
            var result = container.Resolve<ObjectWithOverloads>("callFirstOverload");
            Console.WriteLine(result.FirstOverloadCalls);

4.7 數組配置

   <!--數組-->
    <register type="ILogger" name="main" mapTo="MockLogger" />
    <register type="ILogger" name="another" mapTo="MockLogger" />
    <register type="ILogger" name="special" mapTo="SpecialLogger" />
    <register type="ArrayDependencyObject" name="specificElements">
      <property name="Loggers">
        <array>
          <dependency name="main" />
          <dependency name="another" />
        </array>
      </property>
    </register>

定義類:

View Code
   class ArrayDependencyObject
    {
        public ILogger[] Loggers { get; set; }

        public string[] Strings { get; set; }
    }
    class SpecialLogger : ILogger
    {

        #region ILogger 成員

        public void ShowInfo()
        {
            throw new NotImplementedException();
        }

        #endregion
    }

代碼調用:

   var result2 = container.Resolve<ArrayDependencyObject>("specificElements");

可以看到result2執行完成后,會得到 result2.Loggers數組,這個數組包括2個對象,一個是main

另一個是another,都是ILogger對象。

4.8 LifetimeManager的使用。是定義一個生命週期。這裡就不說了。在我的MVC中,有使用。

 

 

posted @ 2012-05-10 15:23  無限遐想  阅读(10945)  评论(8编辑  收藏  举报