71

2つのスコープの違いは何ですか?

Module各レイヤー(リポジトリ、サービス、MVCアプリ)でビルドしていますInstancePerHttpRequestが、Autofac.Mvcアセンブリが必要です。

リポジトリとサービスレイヤーでどのスコープを使用する必要がありますか?

4

3 に答える 3

128

InstancePerHttpRequest基本的に同じことをInstancePerApiRequest行います。個別のWebリクエストごとにサービスの単一インスタンスを取得します。InstancePerHttpRequest残りの答えには使用しますが、これら2つは交換可能であることに注意してください。

InstancePerLifetimeScopeサービスを要求するライフタイムスコープごとに、サービスの新しいインスタンスが作成されることを意味します。各Webリクエストは、独自の新しいライフタイムスコープを取得するため、実際には、ほとんどの場合、これら2つはまったく同じことを行います。

唯一の本当の違いは、に登録されているInstancePerHttpRequestサービスがあり、として登録されている別のサービスからそれらのサービスの1つを要求した場合に発生しますSingleInstance。このシナリオでは:

  • SingleInstanceコンポーネントはルートスコープに存在します
  • コンポーネントは、ルートスコープのInstancePerHttpRequestである「AutofacWebRequest」と呼ばれるスコープに存在します

Autofacは、子スコープからの解決を許可しません。したがって、基本的に、SingleInstanceサービスはサービスを見つけることができませんInstancePerHttpRequest

ただし、このシナリオでInstancePerLifetimeScope(の代わりにInstancePerHttpRequest)を使用した場合、サービスは問題なく解決されます。

私は、これらすべてを詳細に説明しようとするダウンロード可能なコードを使用して、かなり網羅的な記事を作成しました。ここを参照してください。記事からの引用:

ここでよくある誤解の1つは、コンポーネントをWebAPIアプリケーションのInstancePerLifetimeScopeに登録すると、コンポーネントがWebリクエストのスコープ内にあることを意味します。つまり、「Lifetime」は「WebリクエストのLifetime」を指します。ここでわかるように、これは誤りです。

コンポーネントの寿命は、コンポーネントが解決されたスコープによって決まります。

SingletonResolvableはルートスコープからトークンを解決するため、そのトークンインスタンスは、Webリクエストのスコープではなく、ルートスコープに存在します。前にも言いましたが、もう一度言います。このトークンは、アプリケーション全体が破棄されるまで存続します(たとえば、IISワーカープロセスがリサイクルされます)。ルートスコープからScopeTokenを要求するものには、そのトークンへの参照が与えられます。

お役に立てば幸いです。この質問はかなり古くなっていますが、それでも非常に関連性があります。

于 2014-04-29T05:17:08.430 に答える
7

オブジェクトの存続期間について完全に決定できるアプリケーション内の唯一の場所は、コンポジションルートです。

この場合、競合が発生します(MVC統合によって提供される拡張メソッドにアクセスできない汎用モジュールがあります)が、ライフタイムを適切に管理するには、それにアクセスする必要があります。この場合、モジュールがのような妥当なデフォルトを提供できる場合、InstancePerLifetimeScopeそれはモジュールレベルで行うことです。次に、コンポジションルートにその動作をオーバーライドさせます。この場合、コンポジションルートはライフタイムをに変更しInstancePerHttpRequestます。最後の登録は以前の登録を上書きするので、あなたは良い状態にあるはずです。

私は実際に、いくつかの理由から、特定のレイヤーを含むアセンブリと共存するモジュールの作成から離れました。

  1. Autofacへの依存関係が導入されますが、これはコンポジションルート以外では必要ありません。
  2. これは、モジュールがその存続期間をどのように管理する必要があるかを知っていることを示唆していますが、これは通常は当てはまりません。もしそうなら、その生涯管理を提供するファクトリまたは他のクラスを提供してみませんか?

代わりに(そして保証するのに十分な大きさのプロジェクトでは)、コンポジションルートレベルでモジュールを作成します。このレベルでは、モジュールをどのように相互に接続するかについて明確な知識があります。モジュールを含み、デフォルトのコンポジションルートとして機能するアセンブリを作成することもありますIocが、これは「実際の」コンポジションルート(IocアセンブリをプルするコンソールやMVCアプリケーションなど)でオーバーライドされることがよくあります。

于 2012-08-26T04:57:43.850 に答える
2

Autofacでは、ライフタイムごとのスコープは、ネストされたライフタイムを使用してカスタムスコープを作成する一般的な方法です。

を使用すると、リクエストごとのInstancePerLifetimeScopeスコープが得られます。これにより、単一のリクエストのコンポーネントの有効期間が追加され、このコンポーネントが内部で使用されます。InstancePerLifetimeScrope

InstancePerLifetimeScopeこれが必要なすべての場所で使用します。またはAutofac.Integration.Mvc、サービスレイヤーにアセンブリへの参照があることが問題になる場合は、要求の開始ごとに手動でネストされたスコープを作成し、を使用しますInstancePerLifetimeScope

于 2012-08-26T01:38:00.477 に答える