Обработка включений в MVC 2/MVCContrib
-
19-09-2019 - |
Вопрос
Я хотел бы улучшить свою страницу, объединив и минифицировав JavaScript и CSS
файлы.С MVCContrib уже содержит проект под названием IncludeHandling
, я взглянул на то, что, к сожалению, оставило у меня вопросы без ответа:
В этом процессе участвует довольно много интерфейсов и объектов.Теперь я использую Ninject.Mvc
, но кажется, что MvcContrib.IncludeHandling
использует какой-то дополнительный (самодельный?) DI?Могу ли я обойти это?Кто-нибудь использовал это и может поделиться опытом?
Во-вторых, часто можно услышать совет: размещать статический контент в разных доменах, чтобы запрос не содержал файлы cookie и тому подобное, что значительно упрощает обработку запроса сервером.Но как я могу совместить это с автоматической обработкой включения - разве это не обязательно выполняется в одном и том же приложении?
РЕДАКТИРОВАТЬ:Понял, что на самом деле во всем этом есть только один вызов разрешения, мне действительно интересно, почему они используют для этого DI...Думаю о вилке там...
Решение
Хорошо, MvcContrib.IncludeHandling
использует MvcContrib DependencyResolver
найти необходимые компоненты.Он не очень хорошо документирован (более подробно см. образец сайта, хотя в этом случае используется специальный инжектор).
Например, MvcContrib.Castle
имеет WindsorDependencyResolver
для этого контейнера IoC, который вы можете имитировать, используя NInject (может быть что-то есть, если вы погуглите).Инициализация довольно подробная, но выглядит следующим образом (контейнер — это контейнер Windsor, в вашем случае используйте NInject):
var httpContextProvider = new HttpContextProvider(HttpContext.Current);
var settings = IIncludeHandlingSettings)ConfigurationManager.GetSection("includeHandling");
container.Register(Component.For(typeof(IIncludeReader)).ImplementedBy(typeof(FileSystemIncludeReader)));
container.Register(Component.For(typeof(IIncludeStorage)).ImplementedBy(typeof(StaticIncludeStorage)));
container.Register(Component.For(typeof(IKeyGenerator)).ImplementedBy(typeof(KeyGenerator)));
container.Register(Component.For(typeof(IIncludeHandlingSettings)).Instance(settings));
container.Register(Component.For(typeof(IHttpContextProvider)).Instance(httpContextProvider));
container.Register(Component.For(typeof(IIncludeCombiner)).ImplementedBy(typeof(IncludeCombiner)));
container.Register(Component.For(typeof(IncludeController)).ImplementedBy(typeof(IncludeController)).LifeStyle.Transient);
DependencyResolver.InitializeWith(new WindsorDependencyResolver(Container));
Таким образом, вы можете зарегистрировать все необходимые зависимости.Помните, что вам нужен раздел includeHandler в вашей веб-конфигурации.
<configSections>
<section name="includeHandling" type="MvcContrib.IncludeHandling.Configuration.IncludeHandlingSectionHandler, MvcContrib.IncludeHandling"/>
</configSections>
<includeHandling>
</includeHandling>
Надеюсь, это помогло.
Другие советы
Ознакомьтесь с минификатором Ajax Asp.Net. http://www.asp.net/ajaxlibrary/ajaxminquickstart.ashx
Он поставляется с задачей MS Build, которую вы можете настроить, где при сборке она будет находить и минимизировать файлы Css и Js в вашем проекте...
Вот версия установки DependencyResolver для Unity.Я сделал это как расширение контейнера Unity.
public class ConfigureMvcContrib : UnityContainerExtension
{
protected override void Initialize()
{
var settings = (IIncludeHandlingSettings)ConfigurationManager.GetSection("includeHandling");
Container
.RegisterFactory<IHttpContextProvider>(c => new HttpContextProvider(HttpContext.Current))
.RegisterFactory<IIncludeReader>(c => new FileSystemIncludeReader(c.Resolve<IHttpContextProvider>()))
.RegisterType<IIncludeStorage, StaticIncludeStorage>()
.RegisterType<IKeyGenerator, KeyGenerator>()
.RegisterFactory<IIncludeCombiner, IncludeCombiner>()
.RegisterInstance<IIncludeHandlingSettings>(settings);
DependencyResolver.InitializeWith(new UnityDependencyResolver(Container));
}
}
Стоит отметить, что настройка IncludeHandling не идеальна для настройки веб-кластера из-за способа кэширования.Мне пришлось реализовать собственное действие контроллера, которое требовало объединения и минимизации списка файлов.Могу предоставить дополнительную информацию, если кому интересно.