UnityContainer を拡張する

はじめに

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