1

アプリケーションには、(とりわけ)次のコンポーネントがあります。

  • MyDbContext:エンティティフレームワークのデータアクセス
  • DBResourceProviderFactory:カスタムResourceProviderFactoryを提供するカスタムIResourceProviderDBResourceProvider...と呼ばれる)
  • 他のサービス
  • StructureMap

カスタムリソースプロバイダーは、このSO回答MyDbContextで説明されているのと同様に注入されたを使用して、データベースでリソースを検索しています。

これMyDbContextは他のさまざまなサービスでも使用されており、Webアプリケーションであるため、StructureMapsHttpContextScopedメソッドを使用MyDbContextして、リクエストの有効期間をリクエストの有効期間に制限します(このテーマに関する他のSOの質問とその回答を参照してください)。

x.For<MyDbContext>().HttpContextScoped();

ただし、の存続期間IResourceProviderは単一のhttpリクエストに限定されないようです。したがって、最初の要求の後に破棄される参照にDBResourceProviderぶら下がっています。MyDbContext

このライフタイムの不一致をどのように処理できますか?HttpContextスコープのインスタンスを他のすべてのサービスに返す間、StructureMapはトランジェントMyDbContextを返しますか?IDbResourceProvider

それを行うには、2つの異なる実装が必要ですか?マーカーインターフェース?または、Entity Frameworkを使用してローカライズされたリソース(パフォーマンスなど)を最初に検索するのは悪い考えですか?

4

1 に答える 1

1

依存関係(の1つ)よりもライフタイムが長い(または必要がある)サービスがある場合、一般的な解決策は、ファクトリを使用してそれらの依存関係を取得することです。

あなたの状況では、解決策は簡単かもしれません。がMVCアプリケーションのコンポジションルートDBResourceProviderで定義されている場合、メソッドを使用してを取得することに成功します。DependencyResolver.Current.GetServiceMyDbContext

サービスがコンポジションルートの一部ではない場合DBResourceProvider(たとえば、テストする必要のあるビジネスロジックが含まれているため)、そのロジックを独自のクラスに抽出して、サービスをコンポジションルートに含めることができます。適切なインスタンスを解決できるようにする(シングルトン)ファクトリ(たとえばIDbContextFactoryまたは)を注入できます。Func<MyDbContext>

于 2012-11-08T10:52:10.673 に答える