Обработка включения в MVC 2 / MVCContrib - PullRequest
2 голосов
/ 12 марта 2010

Я бы хотел улучшить свою страницу, комбинируя и минимизируя файлы javascript и CSS. Поскольку MVCContrib уже содержит проект под названием IncludeHandling, я взглянул на этот вопрос, который, к сожалению, оставил мне без ответа вопросы:

Существует довольно много интерфейсов и объектов, вовлеченных в процесс. Сейчас я использую Ninject.Mvc, но похоже, что MvcContrib.IncludeHandling использует какой-то дополнительный (самодельный?) DI? Могу ли я обойти это? Кто-нибудь использовал это и может поделиться своим опытом?

Во-вторых, часто звучит совет размещать статический контент в разных доменах, чтобы запрос не содержал cookie-файлы и тому подобное, что значительно упрощает обработку запроса сервером. Но как я могу совместить это с автоматической обработкой включений - разве это не обязательно должно быть в одном приложении?

РЕДАКТИРОВАТЬ: понял, что на самом деле это всего лишь один вызов разрешения, мне действительно интересно, почему они используют DI для этого ... Думая о развилке там ...

Ответы [ 3 ]

2 голосов
/ 24 ноября 2010

Ну, MvcContrib.IncludeHandling использует MvcContrib's DependencyResolver, чтобы найти необходимые компоненты. Это не очень хорошо задокументировано (см. Образец сайта для более подробной информации, хотя в этом случае используется специальный инжектор).

Например, MvcContrib.Castle имеет WindsorDependencyResolver для этого контейнера IoC, который вы можете имитировать, чтобы использовать NInject (может быть что-то, если вы Google). Инициализация довольно многословна, но идет следующим образом (контейнер - это контейнер 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>

Надеюсь, это помогло.

0 голосов
/ 16 марта 2011

Вот версия Unity для настройки DependencyResolver. Я сделал это как расширение контейнера 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 не идеальна для настройки веб-кластера, так как она выполняет кэширование. Мне пришлось свернуть действие моего собственного контроллера, которое заняло список файлов для объединения и минимизации. Я могу предоставить больше информации, если кому-то интересно.

0 голосов
/ 01 октября 2010

Ознакомьтесь с Asp.Net Ajax Minifier. http://www.asp.net/ajaxlibrary/ajaxminquickstart.ashx

Поставляется с задачей MS Build, которую вы можете настроить, чтобы при сборке он находил и уменьшал файлы Css и Js в вашем проекте ...

...