以前Terry Lee 已經介紹過Unity的簡單使用了,不過那篇文章是針對舊版本的,如今的版本1.2版略有不一樣。html
我下載了Unity並作了一個簡單的測試,項目的分佈是這個樣子:數據庫
LoggerTest.Interface.ILogger 主要是接口, 一個簡單的不能再簡單的方法結構:緩存
public interface ILogger { void Write(string message); }
LoggerTest 是實現這個接口的project, 恩,跟Terry Lee 的例子同樣,實現兩個就OK了,分別是FlatFileLogger和DatabaseLogger。網絡
namespace LoggerTest { public class FlatFileLogger : ILogger { public void Write(string message) { Console.WriteLine(String.Format("Message:{0}", message)); Console.WriteLine("Target:FlatFile"); } } public class DatabaseLogger : ILogger { public void Write(string message) { Console.WriteLine(String.Format("Message:{0}", message)); Console.WriteLine("Target:Database"); } } }
下面是Unity出場的時候了,可能初學者不知道要引用哪些組件(像我就是),這裏截個圖告訴你們:函數
若是是顯示注入,調用Microsoft.Practices.Unity 和Microsoft.Practices.ObjectBuilder2 就能夠了;若是是經過配置文件注入,那麼就要另外引用Microsoft.Practices.Unity.Configurationpost
好了,那麼基本上就大功告成,代碼裏已經註釋的很清楚了測試
//顯式獲取UnityContainer private IUnityContainer GetContainer_Directly() { IUnityContainer container = new UnityContainer(); //若是註冊多個類型須要指定名字(名字是任意的) //不然當調用ResolveAll<>()時,那些沒有指定名字的將會獲取不到 //可是,Resolve<>() 會默認取那些空名字的注入對象。 container.RegisterType<ILogger, DatabaseLogger>("databaseLogger"); container.RegisterType<ILogger, FlatFileLogger>("flatfileLogger"); return container; } //從配置文件獲取UnityContainer private IUnityContainer GetContainer_Config() { IUnityContainer container = new UnityContainer(); UnityConfigurationSection section = (UnityConfigurationSection)System.Configuration.ConfigurationManager.GetSection("unity"); section.Containers[0].Configure(container); return container; } public void Test() { IUnityContainer container = GetContainer_Config(); foreach (ILogger logger in container.ResolveAll<ILogger>()) logger.Write("Bruce Lee"); }
配置文件:ui
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" /> </configSections> <unity> <containers> <container name="One"> <types> <type type="LoggerTest.Interface.ILogger, LoggerTest.Interface" name="FlatFileLogger" mapTo="LoggerTest.FlatFileLogger, LoggerTest"/> <type type="LoggerTest.Interface.ILogger, LoggerTest.Interface" name="DatabaseLogger" mapTo="LoggerTest.DatabaseLogger, LoggerTest"/> </types> </container> </containers> </unity> </configuration>
運行效果:url
後記:Unity的簡單介紹
如下摘自貪睡蟲: http://www.cnblogs.com/liujian969/archive/2009/01/17/1377446.html spa
描述
Unity 應用程序塊(Unity)是一個輕量級、可擴展的依賴注入容器,支持構造函數、屬性和方法調用注入。它爲開發人員提供了以下好處:
- 簡化了對象的建立,尤爲是分層的對象結構和依賴。
- 容許開發人員在運行時或者配置中指定依賴的需求抽象,以及簡化了橫切關注點的管理。
- 服務定位功能容許客戶代碼保存或者緩存容器。這在開發人員能夠持久化容器到 ASP.NET Session 或者 Application 中的 ASP.NET Web 應用程序中特別有用。
常見場景
除了單獨解決橫切關注點如日誌、認證、受權、緩存和異常處理的組件之外,現代業務系統一般由定製的業務對象和在應用程序中完成特殊的或者通常的任務的組件組成。
成功構建這樣的應用程序的關鍵是得到解耦的或者極度鬆耦合的設計。鬆耦合的應用程序更加靈活、更加易於維護。同時在開發期間進行測試,能夠模擬對象的樁(輕量級模擬的實現),這加強了實質的依賴。例如,數據庫鏈接、網絡鏈接、ERP 鏈接和富用戶接口組件。
依賴注入是一種用於構建鬆耦合應用程序的主要技術。它提供了處理對象間依賴的方法。例如,一個處理用戶信息的對象可能依賴於訪問數據存儲、驗證信息和檢查用戶是否被受權執行更新的其餘對象。依賴注入技術能夠確保用戶類正確的初始化及組裝全部這些對象,特別是依賴是抽象的地方。
使用容器能夠有不少好處,但它會改變應用程序的設計方式,尤爲適合於基於組件的開發,朋友們能夠有選擇的使用它。