Я использую 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, но ответ должен быть там наверняка ...