Обновление: не уверен, что это имеет значение, но я использую MVC 5.2.3 и Visual Studio 2015, вопрос немного устарел.
Однако я сделал динамическую связку, которая работает в _viewStart.cshtml. Что я сделал, так это создал вспомогательный класс, который хранит пакеты в словаре пакетов. Затем при запуске приложения я извлекаю их из словаря и регистрирую. И я сделал статический булен "bundlesInitialzed", чтобы пакеты добавлялись в словарь только один раз.
Пример помощника:
public static class KBApplicationCore: .....
{
private static Dictionary<string, Bundle> _bundleDictionary = new Dictionary<string, Bundle>();
public static bool BundlesFinalized { get { return _BundlesFinalized; } }
/// <summary>
/// Add a bundle to the bundle dictionary
/// </summary>
/// <param name="bundle"></param>
/// <returns></returns>
public static bool RegisterBundle(Bundle bundle)
{
if (bundle == null)
throw new ArgumentNullException("bundle");
if (_BundlesFinalized)
throw new InvalidOperationException("The bundles have been finalized and frozen, you can only finalize the bundles once as an app pool recycle is needed to change the bundles afterwards!");
if (_bundleDictionary.ContainsKey(bundle.Path))
return false;
_bundleDictionary.Add(bundle.Path, bundle);
return true;
}
/// <summary>
/// Finalize the bundles, which commits them to the BundleTable.Bundles collection, respects the web.config's debug setting for optimizations
/// </summary>
public static void FinalizeBundles()
{
FinalizeBundles(null);
}
/// <summary>
/// Finalize the bundles, which commits them to the BundleTable.Bundles collection
/// </summary>
/// <param name="forceMinimize">Null = Respect web.config debug setting, True force minification regardless of web.config, False force no minification regardless of web.config</param>
public static void FinalizeBundles(bool? forceMinimize)
{
var bundles = BundleTable.Bundles;
foreach (var bundle in _bundleDictionary.Values)
{
bundles.Add(bundle);
}
if (forceMinimize != null)
BundleTable.EnableOptimizations = forceMinimize.Value;
_BundlesFinalized = true;
}
}
Пример _ViewStart.cshtml
@{
var bundles = BundleTable.Bundles;
var baseUrl = string.Concat("~/App_Plugins/", KBApplicationCore.PackageManifest.FolderName, "/");
//Maybe there is a better way to do this, the goal is to make the bundle configurable without having to recompile the code
if (!KBApplicationCore.BundlesFinalized)
{
//Note, you need to reset the application pool in order for any changes here to be reloaded as the BundlesFinalized property is a static field that will only reset to false when the app restarts.
Bundle mainScripts = new ScriptBundle("~/bundles/scripts/main.js");
mainScripts.Include(new string[] {
baseUrl + "Assets/lib/jquery/jquery.js",
baseUrl + "Assets/lib/jquery/plugins/jqcloud/jqcloud.js",
baseUrl + "Assets/lib/bootstrap/js/bootstrap.js",
baseUrl + "Assets/lib/bootstrap/plugins/treeview/bootstrap-treeview.js",
baseUrl + "Assets/lib/angular/angular.js",
baseUrl + "Assets/lib/ckEditor/ckEditor.js"
});
KBApplicationCore.RegisterBundle(mainScripts);
Bundle appScripts = new ScriptBundle("~/bundles/scripts/app.js");
appScripts.Include(new string[] {
baseUrl + "Assets/app/app.js",
baseUrl + "Assets/app/services/*.js",
baseUrl + "Assets/app/directives/*.js",
baseUrl + "Assets/app/controllers/*.js"
});
KBApplicationCore.RegisterBundle(appScripts);
Bundle mainStyles = new StyleBundle("~/bundles/styles/main.css");
mainStyles.Include(new string[] {
baseUrl + "Assets/lib/bootstrap/build/less/bootstrap.less",
baseUrl + "Assets/lib/bootstrap/plugins/treeview/bootstrap-treeview.css",
baseUrl + "Assets/lib/ckeditor/contents.css",
baseUrl + "Assets/lib/font-awesome/less/font-awesome.less",
baseUrl + "Assets/styles/tlckb.less"
});
mainStyles.Transforms.Add(new BundleTransformer.Core.Transformers.CssTransformer());
mainStyles.Transforms.Add(new CssMinify());
mainStyles.Orderer = new BundleTransformer.Core.Orderers.NullOrderer();
KBApplicationCore.RegisterBundle(mainStyles);
KBApplicationCore.FinalizeBundles(true); //true = Force Optimizations, false = Force non Optmizations, null = respect web.config which is the same as calling the parameterless constructor.
}
}
Примечание. Это следует обновить, чтобы использовать блокировку потока, чтобы предотвратить ввод кода пакета двумя запросами до выхода первого.
Это работает так: запуск представления выполняется при первом запросе к сайту после сброса пула приложений. Он вызывает RegisterBundle в помощнике и передает ScriptBundle или StyleBundle в словарь в порядке вызова RegisterBundle.
Когда вызывается FinalizeBundles, вы можете указать True, что приведет к принудительной оптимизации независимо от настройки отладки web.config, или оставить его нулевым, или использовать конструктор без этого параметра, чтобы он учитывал настройку web.config. Передача false заставит его не использовать оптимизацию, даже если для отладки установлено значение true. FinalizeBundles Регистрирует пакеты в таблице пакетов и устанавливает для параметра _BundlesFinalized значение true.
После завершения попытка снова вызвать RegisterBundle вызовет исключение, в этот момент оно зависает.
Эта настройка позволяет добавлять новые пакеты для просмотра запуска и сбрасывать пул приложений, чтобы они вступили в силу. Первоначальная цель, которую я ставил перед собой, заключалась в том, что я делаю что-то, что будут использовать другие, поэтому я хотел, чтобы они могли полностью изменить интерфейс пользователя без необходимости перестраивать исходный код для изменения пакетов.
person
Ryan Mann
schedule
27.08.2015