2

問題:

Ui、ServiceLayer、BizLayer、DataLayerを使用して4層システムを構築しています。グッドプラクティスに沿って、ServiceLayerはBizLayerとDataLayerをUiから隠します。もちろん、ServiceLayerはUiレイヤーが何であるかを認識していません。

私の実装は、各レイヤーが独自のアセンブリにある単一の.NETアプリケーションです。MVC3 UiレイヤーでAutofac.MVC3を使用して、Webリクエストで使用されるすべての解決クラスを実行しています。また、ServiceLayerに標準のAutofacを含めて、アプリケーション内の他のすべてのレイヤーの登録を処理できるようにします。システムの起動時に、すべてのタイプをAutofacに登録するメソッドを呼び出します。これは行います:

  1. ServiceLayer内のモジュールを呼び出して、下位レベルを登録します。これは、標準のNuGetAutofacパッケージを使用してそれ自体と他のすべてのアセンブリの登録を処理します。
  2. 次に、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ですか?

4

2 に答える 2

0

InstancePerHttpRequestScopeは、実際にはInstantPerLifetimeScopeのバリアントです。最初のものはリクエストでのみ機能します。バックグラウンドスレッドで何かを実行したい場合、それは利用できません。

あなたのように、私はas.netmvcと複数のアプリレイヤーでautofacを使用しています。ライフタイムスコープが必要な場合は、コンテナ自体を渡します。タスクを実行するバックグラウンドキューがあります。各タックは、独自のスコープを持ち、トランザクションで実行される必要があります。キューにはIContainer(シングルトン)のインスタンスがあり、すべてのタスクに対して、新しいスコープを開始してタスクを実行します。

この場合に機能するように、DbアクセスとすべてがINstancePerLifetimeScopeとして設定されており、コントローラーで使用しても問題はありません。

于 2012-06-13T10:35:34.663 に答える
0

MikeSW、Cecil Philips、Travis Illig(みんなありがとう)の助けを借りて、私は正しい軌道に乗った。さまざまな投稿、特にAlex Meyer-Gleavesの投稿をここで読んだところ、特定の制限内で、Autofac.MVCパッケージによって解決されたときにInstancePerLifetimeScopeがInstancePerHttpRequestとして扱われるようです(これらの制限については、Alexの投稿を読んでください)。アレックスのコメントは次のとおりです。

InstancePerHttpRequestを使用すると、実行時にサービスが正しいライフタイムスコープから確実に解決されます。MVCの場合、これは常に特別なHTTPリクエストの有効期間スコープです。

これは、htppリクエスト全体に対して単一のインスタンスを必要とするものをInstancePerLifetimeScopeとして安全に登録できることを意味し、子スコープのアイテムがない限り正常に機能します。それは問題ありません、そして私はそれで働くことができます。

于 2012-06-14T13:29:33.417 に答える