メモ
問題
次のようなFooクラスのInitialize()メソッドで、シングルトンを生成する場合を考えます。
public class Foo : IFoo, IInitializable { [Inject] private IFactory<int, IBoo> booFactory; private int num = 5; void Initialize(){ booFactory.Create(num); } } public interface IFoo { }
ここで、1つだけ存在するBooインスタンスを次のようなHogeクラスのフィールドbooに注入しようとした時、上手くいきません。
public class Hoge { [Inject] private IBoo boo; }
Installerはこんな感じ。
Container.BindIFactory<int, IBoo>().To<Boo>.AsSingle();
Container.Bind<IBoo>().To<Boo>().AsSingle();
これだと二箇所でAsSingle()を宣言してしまっているので、この時点で上手くいかないのは僕でも分かります。 しかしそれではどうしたら良いのか...
強引な解決法
public class Foo : IFoo, IInitializable { [Inject] private IFactory<int, IBoo> booFactory; private int num = 5; public IBoo boo {get; set;} void Initialize(){ boo = booFactory.Create(num); } } public interface IFoo { IBoo boo {get; set;} }
public class Hoge { [Inject] private IFoo foo; private IBoo boo; void Initialize() { boo = foo.boo; } }
Container.BindIFactory<int, IBoo>().To<Boo>.AsSingle();
Container.BInd<IFoo>().To<Foo>().AsSingle();
これでHogeクラスのbooにBooのインスタンスが入るので、やりたいことは実現できたことになります。
でも、HogeがBooのインスタンスを手に入れるためにFooを仲介しなきゃいけない所がなんだか気持ち悪い感じがします...
もっと上手くやる方法はないのでしょうか...