Кто создает _Layout.cshtml - PullRequest
       11

Кто создает _Layout.cshtml

1 голос
/ 17 января 2012

Я использую IDependencyResolver реализацию для Windsor с пользовательским WebViewPage, у которого есть служба в качестве свойства (предположим, служба журналирования) для всего проекта MVC3.

Служба внедряется ввсе представления (их создание проходит через IDependencyResolver).

Проблема заключается в том, что в _Layout.cshtml (макет) служба остается нулевой.

Поэтому вопрос в том, кто создаетмакет, поскольку он не создан IDependencyResolver (или, может быть, я просто упускаю очевидное)?

Редактировать:

public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel>
{
    public ILocalizer Localizer { get; set; }
}

затем

<pages pageBaseType="[full namespace].WebViewPage">

в разделах system.web.webPages.razor и system.web в файле web.config из ~ / Views и, наконец, преобразователь зависимостей:

public class WindsorDependencyResolver : IDependencyResolver
{
    private readonly IKernel kernel;

    public WindsorDependencyResolver(IKernel kernel)
    {
        this.kernel = kernel;
    }

    public object GetService(Type serviceType)
    {
        return kernel.HasComponent(serviceType) ? kernel.Resolve(serviceType) : RegisterAndResolve(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return kernel.HasComponent(serviceType) ? kernel.ResolveAll(serviceType).Cast<object>() : new object[] { };
    }

    private object RegisterAndResolve(Type serviceType)
    {
        if (!serviceType.IsAbstract && !serviceType.IsInterface)
        {
            kernel.Register(Component.For(serviceType).ImplementedBy(serviceType).LifestylePerWebRequest());
            return kernel.Resolve(serviceType);
        }
        return null;
    }
}

Установлен преобразователь зависимостейв Global.asax.cs:

var dependencyResolver = new WindsorDependencyResolver(container.Kernel);
DependencyResolver.SetResolver(dependencyResolver);

Когда создается любое представление (Index.cshtml), вызывается метод GetService из средства разрешения зависимостей, и представление создается контейнером.Для _Layout.cshtml этот метод не вызывается.

Поэтому, когда я делаю это в Index.cshtml: @Localizer.Localize(....), служба localizaer не равна нулю, но в _Layout.cshtml это null, конкретная проблемаЯ не могу ничего локализовать в представлении (и не хочу иметь представление для каждой поддерживаемой локали).

Надеюсь, теперь это более понятно.

Изменить: Все еще нет четкого ответа на этот вопрос ... У меня не было времени, чтобы проверить источники MVC, но ответ должен быть там наверняка ...

1 Ответ

1 голос
/ 17 января 2012

Создано движком Razor. Его базовый тип определен внутри ~/views/web.config в атрибуте pageBaseType узла pages. По умолчанию это System.Web.Mvc.WebViewPage.

Если вы хотите внедрить зависимости в свои шаблоны Razor (независимо от того, является ли _Layout или какой-либо другой вид), вы можете определить свой базовый тип страницы:

public abstract class MyWebViewPage<T> : WebViewPage<T>
{
    public MyWebViewPage()
    {
        SomeDependency = DependencyResolver.Current.GetService<IFoo>();
    }

    public IFoo SomeDependency { get; private set; }
}

затем в ~/views/web.config вы устанавливаете базовый тип:

<pages pageBaseType="AppName.Controllers.MyWebViewPage">

и тогда все ваши шаблоны будут иметь свойство SomeDependency:

@model MyViewModel
@SomeDependency.FooBar()

Обратите внимание, что в некоторых ситуациях это может быть не лучшим выбором для дизайна. Если вы намереваетесь внедрить некоторый пользовательский помощник HTML в ваше представление, тогда все в порядке. Но если вы намереваетесь внедрить некоторую доменную службу и ваши представления начинают извлекать зависимости слева и справа вместо использования моделей представлений, то вы делаете серьезную ошибку проектирования, потому что представление не несет ответственности за выборку зависимостей. Его обязанность заключается в отображении информации, которая передается в форме модели представления. Откуда эта информация взята, не является обязанностью взгляда. Это контроллер для координации выборки данных и помещения их в модель представления, которая передается в представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...