WPFのUnityContainerでシングルトン管理する方法。PrismのModuleで使うかも

元プロの社畜 @nabeemichi です。

WPFって何状態から3週間ほど経過して、そこそこアプリの規模も大きくなってきた。

開発し始めたときから、DIコンテナとしてUnityを利用していたのだが、

シングルトンでインスタンス管理したい場面と出くわしてので、メモとして記録しておく。

シングルトンとしてコンテナ内で管理する方法

IUnityContainerでRegisterTypeするときに、ContainerControlledLifetimeManagerを渡してあげるとシングルトンとして管理される

using Microsoft.Practices.Unity;
using Prism.Modularity;

    public class HogeModule : IModule
    {

        [Dependency]
        public IUnityContainer Container { private get; set; }

        
        public void Initialize()
        {
            // シングルトン化するためにライフタイムマネージャーを渡す
            Container
                .RegisterType<IHoge, Hoge>(new  ContainerControlledLifetimeManager());
        }
    }

PrismライブラリのModuleを利用して、実装している場合に[Dependency]でインジェクションしたいクラスをコンテナに登録する場合などに利用する。

RegisterTypeでContainerControlledLifetimeManagerを渡さない場合は、[Dependency]でインジェクションするたびにインスタンスが生成される。

実験方法

シングルトン管理対象クラスにコンストラクタを作成する。

今回の場合はHogeクラスにコンストラクタを実装する。

public class Hoge : IHoge
{
     public Hoge {
        Console.Write("hoge");
     }
}

このコンストラクタ部分にブレークポイントおいたりしてテストすると、コンストラクタが一回しか呼ばれないことで確認できる。

このHogeクラスをインジェクションするクラスを2つ作成

using Microsoft.Practices.Unity;
public class Foo : IFoo
{
        [Dependency]
        public IHoge Hoge { private get; set; }

}
using Microsoft.Practices.Unity;
public class Zoo : IZoo
{
        [Dependency]
        public IHoge Hoge { private get; set; }

}

こいつらを適当にインスタンス化するとテストできる。

ちなみにHogeModuleクラスで

Container
       .RegisterType<IHoge, Hoge>(new  ContainerControlledLifetimeManager());

この部分を

Container
       .RegisterType<IHoge, Hoge>();

こう変えると、ブレークポイントでHogeクラスのコンストラクタが2回よばれることを確認できる。