Unity 3(一):簡介與示例


  本文關注以下方面(環境為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>

再次運行,一切正常


免責聲明!

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



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