問題:
Ui、ServiceLayer、BizLayer、DataLayerを使用して4層システムを構築しています。グッドプラクティスに沿って、ServiceLayerはBizLayerとDataLayerをUiから隠します。もちろん、ServiceLayerはUiレイヤーが何であるかを認識していません。
私の実装は、各レイヤーが独自のアセンブリにある単一の.NETアプリケーションです。MVC3 UiレイヤーでAutofac.MVC3を使用して、Webリクエストで使用されるすべての解決クラスを実行しています。また、ServiceLayerに標準のAutofacを含めて、アプリケーション内の他のすべてのレイヤーの登録を処理できるようにします。システムの起動時に、すべてのタイプをAutofacに登録するメソッドを呼び出します。これは行います:
- ServiceLayer内のモジュールを呼び出して、下位レベルを登録します。これは、標準のNuGetAutofacパッケージを使用してそれ自体と他のすべてのアセンブリの登録を処理します。
- 次に、UiレイヤーはNuGet Autofac.MVCパッケージを使用して、さまざまなコントローラーとアクションメソッドインジェクション用のIActionInvokerを登録します。
DataLayerのUnitOfWorkクラスは、プレーンなAutofacを使用し、InstancePerHttpRequestについて何も知らないServiceLayerによって登録されているため、現在InstancePerLifetimeScopeに登録されています。ただし、ここでは、InstancePerHttpRequestスコープを使用する必要があることを読みました。
質問:
私の質問は、ライフタイムスコープを渡すことができますか?つまり、MVCレイヤーはInstancePerHttpRequestをサービスレイヤーに渡して、必要な場所で使用できますか?Alex Meyer-Gleavesは、以下のこの投稿からの彼のコメントで、これが可能であると示唆しているようです。
独自のILifetimeScopeProvider実装をAutofacDependencyResolverに渡して、ASP.NETランタイムの外部でライフタイムスコープの作成を制御できるようにすることもできます。
ただし、ILifetimeScopeProviderはMVC拡張クラスであるため、彼が提案する方法はMVC固有のようです。誰かが別の方法を提案できますか、それともInstancePerLifetimeScopeはOKですか?