我们希望将System.Web.Optimization的捆绑机制与较少的变压器结合使用。
问题是相同的应用程序/服务器为不同品牌的网站提供页面。因此,根据“SiteContext”使用相同的.less文件,但是.less变量应该使用不同的值。因此,我们希望(Re)使用相同的更少的文件,但是使用不同的变量,这取决于请求的上下文。
我尝试了几种不同的理论:
在所有3种情况下,我根据SiteContext设置了不同的包。
1通过使用拦截variables.less文件的自定义VirtualPathProvider,使用主题变量注入@import指令VirtualPathProvider。
所以我有:
这是不起作用的,因为BundleTransformer缓存将其视为相同的文件,并且不了解SiteContext。缓存密钥基于IAsset的Url,我们不能影响这种行为。
2将variables.less导入替换为变量-主题.,它使用运行在较小转换器之前的自定义转换器。
同样没有运气,同样的缓存问题。
作为一个副作用,在调试中没有调用额外的转换器,因为资产不是捆绑在一起的,而是由LessAssetHandler单独调用的。这可以通过编写您自己的调用所有所需变压器的AssetHandler来解决。
3创建主题资产名称,由自定义VirtualPathProvider解析。将头-emeX.less添加到包中,此文件不存在,但您可以将该文件解析为header.less,并使用方法2设置正确的变量文件导入。(将variables.less导入主题版本)。
再一次没有运气。我认为,如果不是Bundle.Include(string virtualPath)在内部执行File.Exists(path),那么这可以解决缓存问题。它不会通过CustomVirtualPathProvider。
我是想深入解决这个问题吗?所有的想法都是受欢迎的,我可以想象,随着System.Web.Optimization库变得越来越流行,这将成为越来越多的人的问题。
请记住:
谢谢你的反馈。
发布于 2014-04-29 11:42:22
迈克尔!
在多租户环境中使用微软ASP.NET网络优化框架和捆绑变压器,因此需要替换System.Web.Optimization的一些组件,并创建自己版本的调试handlers(参见问题:将较少的文件导入添加到BundleResponse.Files集合中讨论)。据我所知,木拉提卡吉尔在SmartStore.NET项目中解决了所有这些问题。
在捆绑变压器中有两种注入较少变量的方法:
GlobalVariables和ModifyVariables:
使用System.Collections.Generic;使用System.Web.Optimization;使用BundleTransformer.Core.Builders;使用BundleTransformer.Core.Orderers;使用BundleTransformer.Core.Transformers;使用BundleTransformer.Core.Translators;使用BundleTransformer.Less.Translators;var lessTranslator =新的lessTranslator { GlobalVariables =“my-GlobalVariables=‘Hurrah!’”,ModifyVariables =“字体-家族-基=‘Comic’;body-bg=lime;字体大小-H1=50 bg”};var cssTransformer =新CssTransformer(新列表{ LessTranslator });var commonStylesBundle =新绑定(“~/Bundles/BootstrapStyle”);"~/Content/less/bootstrap-3.1.1/bootstrap.less");commonStylesBundle.Builder = nullBuilder;commonStylesBundle.Transforms.Add(cssTransformer);commonStylesBundle.Orderer = nullOrderer;bundles.Add(commonStylesBundle);}并将此转换注册如下:
using System.Web.Optimization;
using BundleTransformer.Core.Orderers;
using BundleTransformer.Core.Bundles;
public class BundleConfig
{
public static void RegisterBundles(BundleCollection bundles)
{
var nullOrderer = new NullOrderer();
const string beforeLessCodeToInject = @"@my-variable: 'Hurrah!';";
const string afterLessCodeToInject = @"@font-family-base: 'Comic Sans MS';
@body-bg: lime;
@font-size-h1: 50px;";
var commonStylesBundle = new CustomStyleBundle("~/Bundles/BootstrapStyles");
commonStylesBundle.Include(
"~/Content/less/bootstrap-3.1.1/bootstrap.less",
new InjectContentItemTransform(beforeLessCodeToInject, afterLessCodeToInject));
commonStylesBundle.Orderer = nullOrderer;
bundles.Add(commonStylesBundle);
}
}这两种方法都有缺点:在调试模式下注入较少的变量不起作用。
https://stackoverflow.com/questions/16945938
复制相似问题