我正在使用ASP MVC开发多租户应用程序。租户由子域标识。我正在使用System.Web.Optimization进行捆绑和缩小以及BundleTransformer.Less。
可以通过为每个租户应用一组特定的LESS变量来设置UI主题。这些变量存储在数据库中。
根据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”)时会发生什么?是否基于虚拟路径和租户标识捆绑响应?
我几乎可以肯定,多个特定于租户的捆绑包响应已存储在缓存中。我安装了Glimpse并检查了缓存:我发现每个租户都为该捆绑包列出了一个条目。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句