0

WCF拡張機能とWeb拡張機能を備えたNinject 3.01.1.10を使用しています(すべてnugetから)

エンティティ フレームワークとリポジトリ パターンを使用して、WCF サービス (複数のクライアント デスクトップ アプリを含む) で NInject を使用しています。

私は EF を使用しているので、サービス リクエストがあるたびに各リポジトリが作成されるように、InRequestScope を使用したいと考えていました (EF のグッド プラクティスに従って)。

Ninject WCFサンプルが示すように、nugetを介してすべてをインストールし、RegisterServicesにサービスを登録するNinjectWebCommonブートストラップクラスを用意しました。また、オンラインのどこかで読んだように、InstanceContextMode.PerCall に WCF サービスがあります。

私の質問は、スコープが機能するように、注入されたオブジェクトのすべてのチェーンが InRequestScope にある必要がありますか?

私の WCF サービスには、コンストラクターで ServiceHandlerDispatcher が挿入されています。

public VanillaService(IServiceHandlerDispatcher serviceHandlerDispatcher) { ... }

この ServiceHandlerDispatcher には、オブジェクト ServiceHandler のディクショナリがあり、クライアントのハンドラー要求に従って Controller オブジェクトを呼び出します。このコントローラ オブジェクトには、リポジトリを使用するメソッドがあります。

public ServiceHandlerDispatcher(IMessageHandler[] messageHandlers) { ... }

public SaveSubmissionHandler(SubmissionController submissionController) { ... }

public SubmissionController(IRepository<Submission> submissionRepository) { ... }

チェーンは次のようなものです: サービス -> ServiceHandlerDispatcher -> ServiceHandler -> コントローラー -> リポジトリ -> DB

パフォーマンスとメモリの目的で、ServiceHandlerDispatcher とすべての ServiceHandler をシングルトン スコープにする必要がありましたが、InRequestScope のリポジトリ オブジェクトが必要でした (各呼び出しで EF の DbContext が破棄されるように)。これは、多数の ServiceHandler オブジェクトを使用できるためです。

繰り返しますが、サービス -> ServiceHandlerDispatcher (SingletonScope) -> ServiceHandler (SingletonScope) -> コントローラー (なし) -> リポジトリ (InRequestScope) -> DB

これは可能ですか、それともカーネルが各呼び出しで各 ServiceHandler を作成する必要がありますか? チェーン内のすべてのオブジェクトが InRequestScope である必要がある場合、ServiceHandler ディクショナリを実装する方法は? Factory エクステンションとは?

4

1 に答える 1

1

したがって、これは不可能です。チェーン内の最初のアイテムのスコープが他のアイテム (この場合は SingletonScope) よりも大きい場合、チェーン内の他のアイテムもそのスコープを持ちます。

于 2012-11-01T09:44:42.920 に答える