はじめに
UnityContainer を拡張するために UnityContainerExtension クラスが用意されています。
このクラスを継承して独自の Extension を作れば、UnityContainer の挙動を拡張できます。
例として、先日のサンプルを書き換えてみます。
独自の Extension を作成
public class AnimalExtension : UnityContainerExtension
{
protected override void Initialize()
{
// 動物クラスを複数まとめて登録する
Container.RegisterType<IAnimal, Dog>("Dog");
Container.RegisterType<IAnimal, Cat>("Cat");
Container.RegisterType<IAnimal, Wankuma>("Wankuma");
}
}
Container だけでなく、Policies や Strategies にもアクセスできます。
Policies や Strategies は後日調べる予定。
作成した Extension を UnityContainer に登録する
static void Main(string[] args)
{
// DI コンテナ生成
IUnityContainer container = new UnityContainer();
// Extension を登録
container.AddNewExtension<AnimalExtension>();
// 依存性注入済みのインスタンスを生成
Person person = container.Resolve<Person>();
person.CallPet();
}
もちろん構成ファイルで Extension を指定可能
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration,Version=1.1.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35"/>
</configSections>
<unity>
<containers>
<container name="Sample">
<extensions>
<add type="ExtensionSample.AnimalExtension, ExtensionSample"/>
</extensions>
</container>
</containers>
</unity>
</configuration>
まとめ
自社フレームワークなんかに UnityContainer を採用するなら、
まとめて型を登録できるように Extension を用意した方が良さそうです。
Enterprise Library の各 Application Block も、
構成ファイルの内容を元に型を登録する Extension を提供していますしね。