はじめに
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 を提供していますしね。