これは、私がやろうとしていることについての背景がなければ、尋ねるのが難しい質問です。既存のマルチテナント ASP.NET MVC 3 アプリケーション (典型的なフォーム オーバー データ アプリケーション) に取り組んでいますが、テナントが任意のページにカスタム フィールドを追加できる機能を提供する必要があります。すべてのテナントが持つページの固定セットがありますが、それらのページの 1 つのどこにでもフィールドを追加できます。たとえば、住所を入力するフィールドがあるユーザー プロファイル ページでは、テナントは国フィールドの前に郡フィールドを追加することができます。
各テナントのカスタム フィールドの構成はデータベースに保存されます。データベースには、フィールドの内容 (テキスト ボックス、選択など) と、ルートや挿入するフィールドの ID など、レンダリングする場所を示す情報が含まれます。前。
これは既存のアプリケーションであるため、いくつかの制限があり、すべての既存の .cshtml ビューをすべてのテナントのデフォルト/ベースとして保持したいと考えていました。ページに追加されたテナント固有のフィールドを取得するために、次のカスタム VirtualPathProvider を作成しました。
- .cshtm ファイルで定義された標準ビューを標準ビュー ディレクトリからロードします。
- ビューのカスタム フィールド定義をデータベースから読み込みます (要求を行うテナントに固有)。
- カスタム フィールドごとに Razor マークアップを作成し、それをステップ 1 で読み込まれたビューに挿入します。
- ベースとテナント固有のコードの両方を含む結合ビューを返します
この設計は、ビューの最初のリクエストでは正常に機能しますが、テナントからの後続のリクエストでは最初のバージョンが返されます。ここで起こっていることは、ASP.NET ランタイムがビューをコンパイルしてキャッシュしているため、ビューに対する次の要求がキャッシュから出てくることだと確信しています。
それでは最後に質問です。各ビューがテナントごとに 1 回キャッシュされるように、テナントの ID などを含めることができるように、コンパイルとキャッシュをオーバーライドするにはどうすればよいでしょうか?