はじめてのUnity

CodePlex Archive
マイクロソフトが出しているDIコンテナですが、ちょっと興味があったので弄ってみました。

http://www.microsoft.com/downloads/details.aspx?FamilyId=6A9E363C-8E0A-48D3-BBE4-C2F36423E2DF&displaylang=en&hash=aBGhzv3UZX8uqX0aMdoKbxV9bzV8xWVigGzUoYDxEr8ZLApv1HNVx9jtfHPIg3bgREX5h6Z%2f0OKNWEvXJSCW2A%3d%3d
まずは、ここからダウンロードし、インストーラを起動。

デフォルトだと、

C:\Program Files\Microsoft Unity Application Block 1.0

ここにインストールされます。

では、早速、サンプルの作成してみましょう。簡単な方が良いのでコンソールアプリケーションのプロジェクトを作成します。で、

上記3つのアセンブリを参照に追加します(アセンブリはインストール先のbinの下にあります)。

ソースコードは、こんな感じで。

using System;
using System.Configuration;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using Microsoft.Practices.Unity.StaticFactory;

namespace UnitySample
{
    /// <summary>
    /// インタフェース
    /// </summary>
    public interface IGreeting
    {
        void Say(string msg);
    }

    /// <summary>
    /// 実装
    /// </summary>
    public class GreetingImpl : IGreeting
    {

        public void Say(string msg)
        {
            Console.WriteLine("Hi, " + msg);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // コンテナの初期化
            IUnityContainer container = new UnityContainer();
            UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
            section.Containers.Default.Configure(container);

            // 実装を取得
            IGreeting greeting = container.Resolve<IGreeting>();
            greeting.Say("Unity");
        }
    }
}

次に設定ファイルですが、アプリケーション構成ファイルを用意して次のように記述。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity" 
             type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, 
             Microsoft.Practices.Unity.Configuration, Version=1.0.0.0, 
             Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>

  <unity>
    <!-- Lifetime manager types -->
    <typeAliases>
      <!-- あちこちで使う型はここで別名定義しておくと楽 -->
      <typeAlias alias="singleton"
           type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,
               Microsoft.Practices.Unity" />
      <typeAlias alias="external"
           type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager,
               Microsoft.Practices.Unity" />
      <typeAlias alias="MyInterface" type="UnitySample.IGreeting, ConsoleApplication9"/>
      <typeAlias alias="MyObject" type="UnitySample.GreetingImpl, ConsoleApplication9"/>
      
    </typeAliases>
    <containers>
      <container>
        <types>
          <type type="UnitySample.IGreeting, ConsoleApplication9" 
                mapTo="UnitySample.GreetingImpl, ConsoleApplication9">
            <!-- デフォルトは取得毎にインスタンスが生成されるのでシングルトンにしてみる-->
            <lifetime type="singleton"/>
          </type>
          <!-- typeAliasを使うことも可能
          <type type="MyInterface" mapTo="MyObject"/>
          -->
        </types>
        
        
      </container>
    </containers>
  </unity>
</configuration>

これで準備完了。実行すると、きちんとインジェクションされます。