ASP MVC를 사용하여 다중 사용자 응용 프로그램을 개발 중입니다. 세입자는 하위 도메인으로 식별됩니다. 번들 및 축소 및 BundleTransformer.Less에 System.Web.Optimization을 사용하고 있습니다.멀티 테넌트 ASP MVC 응용 프로그램 번들
UI는 각 테넌트에 특정 LESS 변수 세트를 적용하여 주제를 지정할 수 있습니다. 이 변수는 DB에 저장됩니다.
제안에 따라 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")를 수행하면 어떻게됩니까? 가상 경로 및 거주자를 기반으로 번들 응답을 식별합니까?