Пользовательский класс Razor View и внедрение зависимостей - PullRequest
7 голосов
/ 02 июня 2011

У меня есть пользовательский базовый класс вида бритвы, у которого есть свойство для службы, зависящей от локализации, которая внедряется с Unity через внедрение свойства.

Если я использую свойство в представлении, свойство правильно разрешается,Но если я попытаюсь использовать одно и то же свойство в макете (главной странице), это свойство еще не устанавливается.

Может кто-нибудь объяснить, как представления обрабатываются и компилируются до того, как Unity пытается разрешить представление и внедрить зависимости.

Я пытаюсь установить заголовок каждого представления, используя соглашение [ViewName.Title] и поиск службы локализации, который прекрасно работает в View, но я не хочу повторять его в каждом View.У меня есть чувство, чтобы переместить логику в _ViewStart.cshtml, но ViewBag или моя служба локализации там недоступны.

Базовый класс:

public abstract class LocalizeBaseWebViewPage<TModel> : WebViewPage<TModel>
{
    [Microsoft.Practices.Unity.Dependency]
    public ILocalizationService LocalizationService { get; set; }

    public virtual string Localize(string key)
    {
        return LocalizationService.GetResource(key);
    }
}

Это работает в Index.cshtml

@{
    ViewBag.Title = Localize("Title");
    Layout = "~/Views/Shared/_Layout.cshtml";
}

Но не в _Layout.cshtml, поскольку для службы не установлена ​​ссылка на объект.

@{
    ViewBag.Title = Localize("Title");
}

1 Ответ

2 голосов
/ 15 июня 2011

Внедрение зависимостей не работает на страницах макета asp.net mvc 3 по дизайну (это означает, что для BaseView в главной странице DI также не работает). Таким образом, вы можете для страниц макета разрешить ваши LocalizationService - UnityContainer (поэтому вам нужно хранить свой контейнер в HttpApplication и обращаться к контейнеру для разрешения зависимости через него).

Кстати, в ActionFilters Dependency также не работает ..

...