2017-05-15 4 views
1

私はdryiocを使用して、複数のスレッドが必要とする依存関係を管理したいと考えています。 iocで依存関係を解決する必要がある各ジョブを渡すスレッドを開始したい。これが理想的にどんな援助にも感謝のように見えるべきかどうかわからない。Dryiocと複数のスレッド

+0

[DryIocウィキ](https://bitbucket.org/dadhi/dryioc/overview)から:_Thread-安全でロックフリー - 登録と解決はコンテナの状態を損なうことなく並行して進めることができます。 - ステートメントが真であれば、心配することなく任意のスレッドから自由に依存関係を注入できます。がんばろう! – BlueStrat

答えて

1

あなたが必要な場合は、サービスはその後、スレッド(スレッドごとに単一インスタンス)にスコープコンテナのThreadScopeContextを設定します。

RootContainer = new Container(scopeContext: new ThreadScopeContext()); 

RootContainer.Register<IService, MyService>(Reuse.InCurrentScope); 

// in your thread 
using (RootContainer.OpenScope()) 
{ 
    var service = RootContainer.Resolve<IService>(); 
    // use the service 
} 

あなたは新しいスレッドでライブを開始、その後同じインスタンスを伝播するサービスが必要な場合async/awaitコール(場合によっては異なるスレッド)を使用して、AsyncExecutionFlowScopeContextを使用します。

DryIocのスコープコンテキストは、オープンスコープを格納できるコンテナとは独立した第三者オブジェクトです。スレッドの静的な場合、またはAsyncLocal変数の場合

もう1つの方法(デフォルトの動作)では、開いているスコープをスコープ付きコンテナに関連付けることですが、解決するにはこの新しいコンテナへの参照が必要です。ここで私は、任意のスコープのコンテキストを使用していないけど、scopedContainer代わりのルート1から解決する必要があります。

RootContainer = new Container(); // without ambient scope context 

RootContainer.Register<IService, MyService>(Reuse.InCurrentScope); 

// in your thread 
using (var scopedContainer = RootContainer.OpenScope()) 
{ 
    var service = scopedContainer.Resolve<IService>(); 
    // use the service 
} 
関連する問題