はじめての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
ここにインストールされます。
では、早速、サンプルの作成してみましょう。簡単な方が良いのでコンソールアプリケーションのプロジェクトを作成します。で、
- Microsoft.Practices.Unity.dll
- Microsoft.Practices.Unity.Configuration.dll
- Microsoft.Practices.Unity.StaticFactory.dll
上記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>
これで準備完了。実行すると、きちんとインジェクションされます。