我正在使用 ASP MVC 开发一个多租户应用程序。租户由子域标识。我正在使用 System.Web.Optimization 进行捆绑和缩小以及 BundleTransformer.Less。
UI 可以通过为每个租户应用一组特定的 LESS 变量来设置主题。这些变量存储在数据库中。
根据https://stackoverflow.com/users/1292362/andrey-taritsyn的建议,我实现了一个自定义 VirtualPathProvider 以在需要它们的更少文件中注入更少的变量。这就像一个魅力!
但是,我对如何管理捆绑和缓存有一些疑问。
我应该抓住每个可能的租户并在 App_Start 上为每个租户注册一个捆绑包吗?(我不喜欢这个选项,因为我应该注册可能永远不会或偶尔使用的捆绑包,我还应该解决为新租户注册新捆绑包而不重新启动的问题)。
我是否应该注意每个请求,检查租户的捆绑包是否存在,如果不存在,请注册它?
最佳解决方案是在 App_Start 只声明一次捆绑包,并在对租户子域的第一个请求进入时创建捆绑包响应并将其存储在缓存中。
我目前实施了选项 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); } }
捆绑包由相同的虚拟路径标识,但是:是否缓存了许多捆绑包响应(特定于租户)?还是只有一个捆绑响应被覆盖?
如何在布局中检索特定于租户的捆绑响应?当我执行 @Styles.Render("~/bundles/css/common") 时会发生什么?是否根据虚拟路径和租户识别捆绑响应?