EntityFrameworkをORMとして使用するASP.NETMVCアプリケーションがあります。現在、EFObjectContextにPerWebRequestライフスタイルを使用しています。
高負荷でのアプリケーションパフォーマンスのプロファイリング中に、ObjectContextの作成にボトルネックが見つかりました。
ObjectContextのライフスタイルをPooledに変更したいのですが、問題があります。
私のアプリケーションのレガシー部分には、ServiceLocatorアンチパターンがあります。そのため、ObjectContextはWebリクエストごとに何度も解決され、使用後に明示的に解放されない可能性があります。
PerWebRequestでは、ObjectContextインスタンスが一度インスタンス化され、EndRequestイベントで保証されてリリースされるため、問題にはなりません。
デフォルトのプールされたライフスタイルでは、 Resolveメソッドの呼び出しごとに異なるObjectContextインスタンスが返されます。しかし、Webリクエストスコープで単一のインスタンスを再利用したいと思います。また、リクエストの最後に( PerWebRequestLifestyleModuleを使用して)インスタンスを自動的に解放(プールに戻す)する必要があります。
Windsor用にカスタムLifestyleManagerまたはカスタムIPoolを実装する必要があるように思われます。しかし、Windsorの経験が不足しているため、PooledとPerWebRequestのライフスタイルを組み合わせる方法がわかりません。
何かアイデアをいただけますか?ありがとう。
UPD:ObjectContextの状態と再利用の理由について
パフォーマンス上の理由があります。ObjectContextの作成にはかなりの費用がかかります。私はそれを回避する方法を探しています。ObjectContextのステートフルな性質に対処し、それを再利用するための2つのアプローチがあります。
- クエリにはステートレスコンテキスト(ChangeTrackingをオフにした状態)を使用します。コマンドの場合は、別のインスタンスを使用します。
- プールに戻ったときにコンテキストの状態をリセットします。