Unityアプリケーションブロックの操作
Castle WindsorやStructureMapと同様に、Unity Application BlockもIoC(制御の反転)コンテナーです。MicrosoftのUnityApplication Blockは、軽量で拡張可能な依存性注入コンテナです。コンストラクターインジェクション、プロパティインジェクション、およびメソッド呼び出しインジェクションのサポートを提供します。ちなみに、Unityアプリケーションブロックはエンタープライズライブラリの一部として導入されました。
依存性の注入と制御の反転のすべてについてよく知らない場合は、ここで簡単に説明します。依存性注入は、IoCの原則を実現したものです。制御の反転と依存性注入はどちらも、アプリケーション内のコンポーネント間の依存関係を解消する方法です。依存性注入の原則は、アプリケーションの高レベルのモジュールが低レベルのモジュールに依存してはならないことを示しています。むしろ、両方とも抽象化に依存する必要があります。
Unityアプリケーションブロックの設計目標
Unityアプリケーションブロックは、依存性注入(DI)コンテナーです。Unity Application Blockは、エンタープライズライブラリ構成システムに依存しないことに注意してください。したがって、システムにインストールされているエンタープライズライブラリを使用せずに、スタンドアロンの依存性注入コンテナとして使用できます。Unityアプリケーションブロックの設計目標は次のとおりです。
- デカップリングによるモジュラー設計の促進
- 高速で拡張可能な軽量の依存性注入コンテナを提供する
- 拡張機能を通じて拡張性のサポートを提供する
- 属性駆動型インジェクションのサポートを提供する
- 依存性注入コンテナに接続して操作するための直感的なAPIのサポートを提供します
入門
このセクションでは、アプリケーションでUnityアプリケーションブロックの使用を開始する方法について説明します。最初のステップは、Unityアプリケーションブロックをシステムにインストールすることです。このライブラリをインストールする最も簡単な方法は、NuGetを使用することです。この図では、ここでコンソールアプリケーションプロジェクトを使用します。Unity Application Blockを使用して最初のアプリケーションをビルドするには、次の手順に従います。
- Visual StudioIDEを開きます
- コンソールプロジェクトを作成し、名前を付けて保存します
- ソリューションエクスプローラーウィンドウでプロジェクトを右クリックします
- [NuGetパッケージの管理...]を選択します
- UnityNuGetパッケージマネージャーをインストールします
Unityを使い始めるための準備を整えるのに必要なのはこれだけです。これで、プロジェクトでUnity ApplicationBlockを使用する準備が整いました。
Unityコンテナを使用したオブジェクトの依存関係の作成と解決
次のコードスニペットに示すように、Unityコンテナーを使用して、特定のオブジェクトへの依存関係を簡単に解決できます。
IUnityContainer container = new UnityContainer();
container.RegisterType();
container.RegisterType();
オブジェクトのタイプをUnityコンテナーに登録するときに、有効期間を指定できます。何も指定しない場合は、デフォルトの有効期間が使用されます。ライフタイムマネージャーは、登録されたオブジェクトのライフタイムを制御します。Unityアプリケーションブロックでサポートされるライフタイムマネージャーのタイプには、TransientLifetimeManager、ContainerControlledLifetimeManager、HierarchicalLifetimeManager、PerThreadLifetimeManager、ExternallyControlledLifetimeManagerが含まれます。
ILoggerと呼ばれる次のインターフェイスについて考えてみます。
public interface ILogger
{
string GetLogTypeName();
}
ILoggerインターフェイスには、GetLogTypeName()という名前の1つのメソッドの宣言が含まれています。FileLoger、DatabaseLogger、およびEventLoggerクラス(以下に示す)は、ILoggerインターフェースを実装します。
public class FileLogger : ILogger
{
public string GetLogTypeName()
{
return "File Logger";
}
}
public class DatabaseLogger: ILogger
{
public string GetLogTypeName()
{
return "Database Logger";
}
}
public class EventLogger: ILogger
{
public string GetLogTypeName()
{
return "Event Logger";
}
}
次のコードリストは、UnityContainerを使用して依存関係を解決する方法を示しています。
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
container.RegisterType();
ILogger iLogger = container.Resolve();
string logType = iLogger.GetLogTypeName();
Console.WriteLine(logType);
Console.Read();
}
Unity Application Blockの「コンテナ」は、依存関係を作成および注入するために使用できるオブジェクトであることに注意してください。RegisterTypeメソッドを使用して、Unityコンテナにタイプまたはタイプマッピングを登録できます。Resolve()メソッドは、Tを使用して前述したジェネリック型に登録されている型の具象インスタンスを返すために使用されます。上記のコード例では、Resolve()メソッドはFileLoggerクラスのインスタンスを返します。
Unity統合を指定する別のアプローチは、構成によるものです。Unity構成でContainerという名前のコンテナーを指定したとすると、次のコードスニペットは、コード内のコンテナーインスタンスでLoadConfigurationメソッドを呼び出す方法を示しています。
string containerName = "Container";
IUnityContainer container = new UnityContainer().LoadConfiguration(containerName);