本文關注以下方面(環境為VS2012、.Net Framework 4.5以及Unity 3):
- Ioc/DI簡介;
- Unity簡單示例
一、Ioc/DI簡介
IoC 即 Inversion of Control,DI 即 Dependency Injection,前一個中文含義為控制反轉,后一個譯為依賴注入,可以理解成一種編程模式,詳細的說明可參見大牛Martin Fowler的強文 http://martinfowler.com/articles/injection.html,借用Hollywood的名言:Don't call us, we'll call you,意即你呆着別動,到時我會找你。控制反轉的核心是控制權的轉移,從原有的應用程序轉移到框架如IoC容器,從而實現模塊間的解耦。
Unity又稱Unity Application Block,是微軟P&P團隊開發的一個輕量級、可擴展的依賴注入容器。它有助於構建松耦合的應用程序和為開發者提供以下便利:
- 簡化對象的創建,特別在分層對象結構和依賴的情形下
- 它支持需求的抽象化,這允許開發人員在運行時或在配置文件中指定依賴,簡化橫切關注點(crosscutting concerns)的管理
- 它通過把組件配置推給容器來決定,增加了靈活性
- 服務定位能力; 這使客戶端能夠存儲或緩存容器
關於Unity的詳細介紹可移步微軟官網 http://msdn.microsoft.com/en-us/library/dn170416.aspx
二、Unity簡單示例
以Log日志為例
首先,簡單定義日志接口
namespace PCT.Unity.ConsoleAppSample { interface ILog { void Log(string message); } }
控制台日志實現類
namespace PCT.Unity.ConsoleAppSample { class ConsoleLog : ILog { public void Log(string message) { Console.WriteLine(message); } } }
添加Unity引用

在搜索框中輸入Unity

點擊Install即可完成安裝。
注冊(Register)和使用(Resolve)代碼如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Practices.Unity; namespace PCT.Unity.ConsoleAppSample { class Program { static void Main(string[] args) { //Register var container = new UnityContainer(); container.RegisterType<ILog, ConsoleLog>(); var logger = container.Resolve<ILog>(); logger.Log("Hello, Unity Application Block"); Console.ReadKey(); } } }
運行效果如下:

三、Unity配置文件示例
代碼container.RegisterType<ILog, ConsoleLog>()改成container.LoadConfiguration()即可,當然要包含Microsoft.Practices.Unity.Configuration命名空間,完整的代碼如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Practices.Unity; using Microsoft.Practices.Unity.Configuration; namespace PCT.Unity.ConsoleAppSample { class Program { static void Main(string[] args) { //Register var container = new UnityContainer(); //container.RegisterType<ILog, ConsoleLog>(); container.LoadConfiguration(); var logger = container.Resolve<ILog>(); logger.Log("Hello, Unity Application Block"); Console.ReadKey(); } } }
修改配置文件如下
<?xml version="1.0"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> </startup> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" /> </configSections> <unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> <assembly name="PCT.Unity.ConsoleAppSample" /> <namespace name="PCT.Unity.ConsoleAppSample" /> <container> <register type="ILog" mapTo="ConsoleLog" /> </container> </unity> </configuration>
運行,發現如下錯誤

不解,Google之發現configSections節點應該放在第一個位置,其它節點無所謂順序。
<?xml version="1.0"?> <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"> <assembly name="PCT.Unity.ConsoleAppSample" /> <namespace name="PCT.Unity.ConsoleAppSample" /> <container> <register type="ILog" mapTo="ConsoleLog" /> </container> </unity> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> </startup> </configuration>
再次運行,一切正常
