我正在创建一个内部应用程序框架,我们组织中的其他开发团队将使用它来构建 MVC 应用程序。作为其中的一部分,我正在为所有视图创建菜单结构,该结构从配置中读取并根据当前用户的权限进行修改。为了将菜单创建为框架的一部分,我创建了一个WebViewPage
带有自定义 HTML Helper 类的自定义实现,该类需要依赖 anApplicationDataReader
来构建菜单。
我已经阅读了各种解释 MVC 需要WebViewPage
有一个无参数构造函数的帖子,所以我需要使用属性注入。我已经配置了 Autofac MVC3 Integration,包括注册一个ViewRegistrationSource
. 麻烦的是,当依赖属性被访问时,它总是空的。
这是我正在尝试拨打的电话的自定义视图页面和助手:
public abstract class OuBaseViewPage<TModel> : WebViewPage<TModel> where TModel : class
{
public OuHelper<TModel> Ou { get; set; }
public override void InitHelpers()
{
base.InitHelpers();
Ou = new OuHelper<TModel>(ViewContext, this);
}
}
public class OuHelper<TModel> where TModel : class
{
public OuHelper(ViewContext viewContext, IViewDataContainer viewDataContainer)
: this(viewContext, viewDataContainer, RouteTable.Routes)
{
}
public OuHelper(ViewContext viewContext, IViewDataContainer viewDataContainer, RouteCollection routeCollection)
{
ViewContext = viewContext;
ViewData = new ViewDataDictionary<TModel>(viewDataContainer.ViewData);
}
public ViewDataDictionary<TModel> ViewData { get; private set; }
public ViewContext ViewContext { get; private set; }
public IList<BusinessFocusArea> ReadFocusAreas()
{
// this is null - yes, service location, but an isolated instance of...
return DependencyResolver.Current.GetService<IDataReader>().Read();
}
}
问题源于在调用之前InitHelpers
(通过Layout.Execute()
)被调用的事实Application_Start
,因此没有任何依赖项被注册。我知道将逻辑注入视图不是一个好习惯,视图应该只是愚蠢的,但这是一个应用程序框架,它需要执行某些使用框架的开发人员不能看到的设置步骤。
我可以遵循更好的方法吗?
这里有一个类似的问题:Autofac 可以将依赖项注入到布局视图文件中吗?