捆绑多租户ASP MVC应用程序

时间:2014-06-14 22:49:27

标签: asp.net-mvc system.web.optimization bundletransformer

我正在使用ASP MVC开发一个多租户应用程序。租户由子域识别。我使用System.Web.Optimization进行捆绑和缩小以及BundleTransformer.Less。

UI可以通过为每个租户应用一组特定的LESS变量来主题化。这些变量存储在DB中。

根据https://stackoverflow.com/users/1292362/andrey-taritsyn的建议,我实现了一个自定义VirtualPathProvider,以便在需要它们的较少文件中注入较少的变量。这就像一个魅力!

但是我对如何管理捆绑和缓存有一些疑问。

  1. 我应该抓住每个可能的租户并为每个租户注册一个捆绑包     一个在App_Start? (我不喜欢这个选项,因为我应该这样     注册可能永远不会或偶尔使用的捆绑包和我     还应解决为新注册新捆绑的问题     租户没有重新启动)。

  2. 我是否应该查看每个请求,检查是否有捆绑包     租户存在,如果没有,请注册吗?

  3. 最佳解决方案是在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;)?是否根据虚拟路径租户识别捆绑响应?

1 个答案:

答案 0 :(得分:1)

我几乎可以肯定,多个特定于租户的捆绑响应存储在缓存中。我安装了Glimpse并检查了缓存:我发现每个租户的一个条目正在列出。