ASP MVC を使用してマルチテナント アプリケーションを開発しています。テナントはサブドメインで識別されます。バンドルと縮小に System.Web.Optimization と BundleTransformer.Less を使用しています。
UI は、テナントごとに特定の LESS 変数のセットを適用することで、テーマを設定できます。これらの変数は DB に格納されます。
https://stackoverflow.com/users/1292362/andrey-taritsynの提案に従って、カスタム VirtualPathProvider を実装して、それらを必要とするより少ないファイルに少ない変数を挿入しました。それは魅力のように機能します!
ただし、バンドルとキャッシングの管理方法については疑問があります。
可能なすべてのテナントを取得し、App_Start でそれぞれのバンドルを登録する必要がありますか? (このオプションは好きではありません。使用されることがない、またはたまにしか使用されない可能性のあるバンドルを登録する必要があり、再起動せずに新しいテナントの新しいバンドルを登録する問題も解決する必要があるためです)。
すべてのリクエストを監視し、テナントのバンドルが存在するかどうかを確認し、存在しない場合は登録する必要がありますか?
最適な解決策は、バンドルを App_Start で 1 回だけ宣言し、テナントのサブドメインへの最初の要求が入ったときにバンドル応答を作成してキャッシュに保存することです。
現在、オプション 3 を実装しており、機能していますが、内部で実際に何が起こっているのかはわかりません。
バンドルとテナントを識別するためにキャッシュ キーをカスタマイズするにはどうすればよいですか? これまでのところ、私はこれをしました:
public class SkinnableBundle : Bundle { public SkinnableBundle(string virtualPath) : this(virtualPath, null) { } public SkinnableBundle(string virtualPath, string cdnPath) : base(virtualPath, cdnPath, new IBundleTransform[] { BundleTransformerContext.Current.Css.GetTransformerInstance() }) { Builder = new NullBuilder(); } public override string GetCacheKey(BundleContext context) { if (context.HttpContext == null) { return base.GetCacheKey(context); } var host = context.HttpContext.Request.Url.Host.ToLowerInvariant(); return string.Format("System.Web.Optimization.Bundle:{0}:{1}", host, context.BundleVirtualPath); } }
バンドルは同じ仮想パスで識別されますが、多くのバンドル応答がキャッシュされていますか (テナント固有)? または、上書きされているバンドル応答が 1 つだけですか?
レイアウトでテナント固有のバンドル応答を取得するにはどうすればよいですか? @Styles.Render("~/bundles/css/common") を実行するとどうなりますか? 仮想パスとテナント に基づいてバンドル レスポンスを識別していますか?