2017-10-22 7 views
0

Inversifyでは、複数のオブジェクト間で単一のオブジェクトインスタンス(過渡寿命を持つ)を共有する最良の方法は何ですか?複数の注入されたインスタンス間で一時オブジェクトインスタンスを共有するにはどうすればよいですか?

だから、私たちは持っているとしましょう:

@injectable() 
class Foo1 { 
    @inject("bar") 
    private bar: IBar; 
} 

@injectable() 
class Foo2 { 
    @inject("bar") 
    private bar: IBar; 
} 

@injectable() 
class Controller { 
    @inject("foo1") 
    private foo1: Foo1; 

    @inject("foo2") 
    private foo2: Foo2; 
} 

「バー」シングルトンをすることなく、それが注入されたインスタンスの両方foo1foo2が同じバーインスタンスを取得するように、IoCコンテナを設定することが可能ですコントローラはどこかに注入されます。

私は考えることができる明白なアプローチは、以下のとおりです。

  1. constructors/newablesとしてFOO1とfoo2はを登録するには、それらは一般的なバーのオブジェクトとそれらをインスタンス化ControllerFactoryに注入しています。

  2. 新しいコントローラをインスタンス化する必要があるたびに作成された子コンテナ内にシングルトンとしてhierarchical DIとレジスタバーを使用します。

明示的なインスタンス化が必要なため、1は理想的ではないと思います。

これを処理するには、より良いアプローチがありますか?

+0

プロパティ注射は説明のための –

答えて

1

あなたが探しているのはリクエスト範囲ですが、まだ利用できません。リクエストスコープでは、現在のリクエストのコンテキストに対してシングルトンを定義できます。

一般的なユースケースは実装が難しいでしょうが、HTTPサーバーの場合はエミュレートできます。各HTTPリクエストで、すべての依存関係をリクエストのコンテキスト内のシングルトンとして処理する必要がある場合。

HTTPリクエストごとにコンテナクローンを作成できますが、あまり効率的ではないでしょう。それが正式にサポートされるまで、あなたが行うことができるようになりますので、私は待っている推薦:

container.bind<IFoo>("IFoo").to(Foo).inRequestScope(); 
container.bind<IBar>("IBar").to(Bar).inRequestScope(); 

container.bind<Controller>("Controller").to(FooBarController) 
     .whenTargetNamed("FooBar"); 
+1

おかげでひどいです。この機能が正式にサポートされるのを楽しみにしています。 – lorefnon

+0

あなたの質問に答えると、実際に私にインスピレーションを与えて、これを実装する簡単な方法を見つけることができました。これは正式にサポートされています:) https://github.com/inversify/InversifyJS/pull/661 –

+0

これは本当に素晴らしいです。どうもありがとう。 – lorefnon

関連する問題