2つのスコープの違いは何ですか?
Module
各レイヤー(リポジトリ、サービス、MVCアプリ)でビルドしていますInstancePerHttpRequest
が、Autofac.Mvcアセンブリが必要です。
リポジトリとサービスレイヤーでどのスコープを使用する必要がありますか?
2つのスコープの違いは何ですか?
Module
各レイヤー(リポジトリ、サービス、MVCアプリ)でビルドしていますInstancePerHttpRequest
が、Autofac.Mvcアセンブリが必要です。
リポジトリとサービスレイヤーでどのスコープを使用する必要がありますか?
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を要求するものには、そのトークンへの参照が与えられます。
お役に立てば幸いです。この質問はかなり古くなっていますが、それでも非常に関連性があります。
オブジェクトの存続期間について完全に決定できるアプリケーション内の唯一の場所は、コンポジションルートです。
この場合、競合が発生します(MVC統合によって提供される拡張メソッドにアクセスできない汎用モジュールがあります)が、ライフタイムを適切に管理するには、それにアクセスする必要があります。この場合、モジュールがのような妥当なデフォルトを提供できる場合、InstancePerLifetimeScope
それはモジュールレベルで行うことです。次に、コンポジションルートにその動作をオーバーライドさせます。この場合、コンポジションルートはライフタイムをに変更しInstancePerHttpRequest
ます。最後の登録は以前の登録を上書きするので、あなたは良い状態にあるはずです。
私は実際に、いくつかの理由から、特定のレイヤーを含むアセンブリと共存するモジュールの作成から離れました。
代わりに(そして保証するのに十分な大きさのプロジェクトでは)、コンポジションルートレベルでモジュールを作成します。このレベルでは、モジュールをどのように相互に接続するかについて明確な知識があります。モジュールを含み、デフォルトのコンポジションルートとして機能するアセンブリを作成することもありますIoc
が、これは「実際の」コンポジションルート(Ioc
アセンブリをプルするコンソールやMVCアプリケーションなど)でオーバーライドされることがよくあります。
Autofacでは、ライフタイムごとのスコープは、ネストされたライフタイムを使用してカスタムスコープを作成する一般的な方法です。
を使用すると、リクエストごとのInstancePerLifetimeScope
スコープが得られます。これにより、単一のリクエストのコンポーネントの有効期間が追加され、このコンポーネントが内部で使用されます。InstancePerLifetimeScrope
InstancePerLifetimeScope
これが必要なすべての場所で使用します。またはAutofac.Integration.Mvc
、サービスレイヤーにアセンブリへの参照があることが問題になる場合は、要求の開始ごとに手動でネストされたスコープを作成し、を使用しますInstancePerLifetimeScope
。