<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      依賴注入容器Unity Application Block快速入門

      概述

      Unity是微軟模式與實踐團隊開發的一個輕量級、可擴展的依賴注入容器,之前我也有過一篇文章《Enterprise Library 4.0中的依賴注入容器(Unity)預覽》對其做過介紹。微軟模式與時間團隊已經在2月份發布了Unity February 2008 CTP版本,官方主頁是:http://www.codeplex.com/unity,大家可以到網站上去下載相關的源代碼。本文將通過一些示例讓您對Unity使用有一個逐步的認識和了解。

      準備相關代碼

      為了接下來的說明,我們先編寫幾個后面需要的接口和類:

      接口ILogger

      public interface ILogger
      {
          void Write(string message);
      }

      FlatFileLogger類

      public class FlatFileLogger : ILogger
      {
          public void Write(string message)
          {
              Console.WriteLine(String.Format("Message:{0}", message));
              Console.WriteLine("Target:FlatFile");
          }
      }

      DatabaseLogger類

      public class DatabaseLogger : ILogger
      {
          public void Write(string message)
          {
              Console.WriteLine(String.Format("Message:{0}",message));
              Console.WriteLine("Target:Database");
          }
      }

      創建容器

      在Unity中創建容器實例有兩種方法,一是直接使用構造函數創建,如下代碼所示:

      class Program
      {
          static void Main(string[] args)
          {
              IUnityContainer container = new UnityContainer();
          }
      }

      第二種通過父容器創建容器,在Unity中提供了層級容器的創建,即可以通過父容器來逐級創建容器:

      Unity_TerryLee_001

      圖1 Unity中層級容器

      通過父容器來創建容器可以使用CreateChildContainer:

      class Program
      {
          static void Main(string[] args)
          {
              UnityContainer parentContainer = new UnityContainer();
      
              UnityContainer childContainer = parentContainer.CreateChildContainer();
          }
      }

      采用層級容器的好處是我們可以對于有不同生命周期的對象放在不同的容器中,如果一個子容器被釋放,不會影響到其它子容器中的對象,但是如果根節點處父容器釋放后,所有的子容器都將被釋放。

      class Program
      {
          static void Main(string[] args)
          {
              UnityContainer parentContainer = new UnityContainer();
      
              UnityContainer childContainer = parentContainer.CreateChildContainer();
      
              // can use both generated objects here
      
              // Dispose child container
              childContainer.Dispose();
      
              // can use only object in parent container here
      
              // Dispose parent container
              parentContainer.Dispose();
          }
      }

      注冊接口映射

      在Unity中提供了Register方法供我們在容器中注冊接口映射:

      class Program
      {
          static void Main(string[] args)
          {
              IUnityContainer container = new UnityContainer();
      
              container.Register<ILogger, DatabaseLogger>();
              container.Register<ILogger, FlatFileLogger>("flatfileLogger");
          }
      }

      第一個泛型參數是基類型,第二個泛型參數是組件類型,它們之間必須滿足一定的泛型約束關系:

      IUnityContainer Register<TFrom, TTo>() where TTo : TFrom;

      另外,如果在注冊組件時沒有指定我們也可以使用非泛型的Register方法進行接口映射:

      class Program
      {
          static void Main(string[] args)
          {
              IUnityContainer container = new UnityContainer();
      
              container.Register(typeof(ILogger),typeof(DatabaseLogger));
              container.Register(typeof(ILogger),typeof(FlatFileLogger),"flatfileLogger");
          }
      }

      獲取對象實例

      在Unity中提供了Get方法用以獲取對象實例,如下代碼所示:

      class Program
      {
          static void Main(string[] args)
          {
              IUnityContainer container = new UnityContainer();
      
              container.Register<ILogger, FlatFileLogger>();
      
              ILogger logger =  container.Get<ILogger>();
      
              logger.Write("TerryLee");
          }
      }

      在上面代碼中,我們在容器中注冊了一個ILogger接口到FlatFileLogger的映射,當調用Get<ILogger>()方法時,將返回ILogger的一個默認的類型實例。運行代碼可以看到:

      Unity_TerryLee_002

      在之前注冊接口映射部分,Register方法有一個重載是為接口映射指定一個特定的名稱,這樣我們可以根據名稱和接口來獲取一個特定類型的對象實例,如下面的代碼我們同時注冊FlatFileLogger和DatabaseLogger到接口ILogger的映射,并未DatabaseLogger指定一個名稱,在使用Get方法的時候就可以通過ILogger和指定的名稱來獲取DatabaseLogger實例:

      class Program
      {
          static void Main(string[] args)
          {
              IUnityContainer container = new UnityContainer();
      
              container.Register<ILogger, FlatFileLogger>();
              container.Register<ILogger, DatabaseLogger>("databaseLogger");
      
              ILogger logger = container.Get<ILogger>("databaseLogger");
      
              logger.Write("TerryLee");
          }
      }

      再運行代碼,可以看到獲取到了DatabaseLogger實例:

      Unity_TerryLee_003

      如果我們同時同時注冊FlatFileLogger和DatabaseLogger到接口ILogger的映射,并且不指定任何名稱,那么直接調用Get方法將會返回后注冊的組件的對象實例,如下面的代碼:

      class Program
      {
          static void Main(string[] args)
          {
              IUnityContainer container = new UnityContainer();
      
              container.Register<ILogger, FlatFileLogger>();
              container.Register<ILogger, DatabaseLogger>();
      
              ILogger logger = container.Get<ILogger>();
      
              logger.Write("TerryLee");
          }
      }

      運行后會返回DatabaseLogger實例:

      Unity_TerryLee_003

      當然我們也可以使用非泛型的Get方法來獲取對象實例:

      class Program
      {
          static void Main(string[] args)
          {
              IUnityContainer container = new UnityContainer();
      
              container.Register<ILogger, FlatFileLogger>();
      
              ILogger logger = container.Get(typeof(ILogger)) as ILogger;
      
              logger.Write("TerryLee");
          }
      }

      獲取所有對象實例

      除了可以獲取單個對象實例之外,我們還可以一次獲取容器中所有與某一接口映射的所有對象實例,但是需要依賴于在注冊映射時提供的名稱,如果沒有指定名稱,通過GetAll方法不會被獲取到。

      class Program
      {
          static void Main(string[] args)
          {
              IUnityContainer container = new UnityContainer();
      
              container.Register<ILogger, FlatFileLogger>();
              container.Register<ILogger, FlatFileLogger>("flatFileLogger");
              container.Register<ILogger, DatabaseLogger>("DatabaseLogger");
      
              IEnumerable<ILogger> loggers = container.GetAll<ILogger>();
      
              foreach (ILogger logger in loggers)
              {
                  if (null != logger)
                  {
                      Console.WriteLine(logger.GetType().ToString());
                  }
              }
          }
      }
      運行后如下,第一個沒有提供名稱的類型實例不會被獲取到:
      Unity_TerryLee_004

      結束語

      關于Unity的一個簡單使用就到這里了,希望能夠對大家有用。使用Unity簡單來說分為創建容器、注冊接口映射、獲取對象實例這樣三步,在下篇文章中,將會說到如何使用配置文件注冊接口映射以及如何注冊Singleton實例等內容。

      posted @ 2008-02-21 23:35  TerryLee  閱讀(27623)  評論(79)    收藏  舉報
      主站蜘蛛池模板: 国产日韩av二区三区| 天天爱天天做天天爽夜夜揉 | 巨爆乳中文字幕爆乳区| 亚洲一区二区av在线| 十八禁国产精品一区二区| 国产第一区二区三区精品| 日本熟妇XXXX潮喷视频| 精品国产片一区二区三区| 女人色熟女乱| 国产精品中文字幕免费| 中文字幕av无码免费一区| 国产精品麻豆成人AV电影艾秋| 南靖县| 人人妻人人爽人人添夜夜欢视频 | 精品国产一区二区三区卡| 国产黄色免费看| 婷婷丁香五月亚洲中文字幕| 国模肉肉视频一区二区三区| 亚洲国产欧美在线人成AAAA| 北岛玲中文字幕人妻系列| 亚洲一区在线观看青青蜜臀| 亚洲AV永久中文无码精品综合| 人人人澡人人肉久久精品| 亚洲老妇女一区二区三区| 2018天天拍拍天天爽视频| 人妻护士在线波多野结衣| 国产卡一卡二卡三免费入口| 日韩精品中文字幕无码一区| 国产精品一区在线蜜臀| 亚洲蜜臀av乱码久久| 性色av 一区二区三区| 亚洲午夜福利精品无码不卡| 亚洲欧美日韩综合一区在线| 日本精品不卡一二三区| 老熟妇老熟女老女人天堂| 国内精品国产三级国产a久久| 免费国产一级特黄aa大片在线| 国产蜜臀一区二区三区四区| 在线精品自拍亚洲第一区| 国产 一区二区三区视频| 国产精品麻豆中文字幕|