我正在使用ASP MVC开发一个多租户应用程序。租户由子域识别。我使用System.Web.Optimization进行捆绑和缩小以及BundleTransformer.Less。
UI可以通过为每个租户应用一组特定的LESS变量来主题化。这些变量存储在DB中。
根据https://stackoverflow.com/users/1292362/andrey-taritsyn的建议,我实现了一个自定义VirtualPathProvider,以便在需要它们的较少文件中注入较少的变量。这就像一个魅力!
但是我对如何管理捆绑和缓存有一些疑问。
我应该抓住每个可能的租户并为每个租户注册一个捆绑包 一个在App_Start? (我不喜欢这个选项,因为我应该这样 注册可能永远不会或偶尔使用的捆绑包和我 还应解决为新注册新捆绑的问题 租户没有重新启动)。
我是否应该查看每个请求,检查是否有捆绑包 租户存在,如果没有,请注册吗?
最佳解决方案是在App_Start上仅声明一次捆绑包,并在第一次请求租户的子域时,创建捆绑响应并存储在缓存中。
< / LI> 醇>我目前已经实施了选项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时,会发生什么(&#34;〜/ bundles / css / common&#34;)?是否根据虚拟路径和租户识别捆绑响应?
答案 0 :(得分:1)
我几乎可以肯定,多个特定于租户的捆绑响应存储在缓存中。我安装了Glimpse并检查了缓存:我发现每个租户的一个条目正在列出。