自定义Razor View基类和依赖注入

时间:2011-06-02 09:25:24

标签: asp.net-mvc-3 razor unity-container

我有一个自定义剃刀视图基类,它具有本地化相关服务的属性,该服务通过属性注入与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 个答案:

答案 0 :(得分:2)

依赖注入在asp.net mvc 3布局页面中不起作用(这意味着对于主页DI中的BaseView也不起作用)。因此,您可以通过布局页面解析LocalizationServiceUnityContainer(因此您需要将容器存储在HttpApplication中并访问Container以通过它解析依赖关系。)

BTW in ActionFilters依赖也不起作用..