【发布时间】:2014-06-14 22:49:27
【问题描述】:
我正在使用 ASP MVC 开发一个多租户应用程序。租户由子域标识。我正在使用 System.Web.Optimization 进行捆绑和缩小以及 BundleTransformer.Less。
可以通过为每个租户应用一组特定的 LESS 变量来设置 UI 主题。这些变量存储在数据库中。
根据https://stackoverflow.com/users/1292362/andrey-taritsyn 的建议,我实现了一个自定义的 VirtualPathProvider 以将更少的变量注入到需要它们的更少文件中。这就像一个魅力!
但是我对如何管理捆绑和缓存有一些疑问。
我是否应该抓住每个可能的租户并为每个租户注册一个捆绑包 一个在 App_Start? (我不喜欢这个选项,因为我应该喜欢 注册可能永远不会或偶尔使用的捆绑包,我 还应该解决为新的注册新捆绑包的问题 租户无需重新启动)。
我是否应该监视每个请求,检查是否为 租户存在,如果不存在,注册它?
最佳解决方案是在 App_Start 处仅声明一次捆绑包,并在租户子域的第一个请求进入时创建捆绑包响应并将其存储在缓存中。
我目前实施了选项 3,它确实有效,但我不知道里面到底发生了什么。
-
如何自定义缓存键以识别捆绑包 AND 租户?到目前为止,我是这样做的:
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") 时会发生什么?是否根据虚拟路径和租户识别捆绑响应?
【问题讨论】:
标签: asp.net-mvc system.web.optimization bundletransformer