我认为应该是一个相当简单的搜索,结果是更多。
Atm我正在为我的所有模型使用基类(MasterModel),然后从ViewPage传递下来< HomeIndexModel>到ViewMasterPage< MasterModel>一切正常。这是在阅读“Scott Gu”的帖子后以这种方式完成的。
然后我考虑从ViewPage继承并扩展Factory或从哪里构建ViewPage ......但后来我迷路了。
谁负责实例化ViewPage,ViewMasterPage和ViewUserControl。
问题或多或少是因为我在99%的所有页面上使用同一个类的实例并且总是在MasterPage上使用,因此在模型中不断传递它是一件痛苦的事。
这是否是正确的方法,或者你们有任何其他建议吗?
更新
我需要能够将从IOC(StructureMap)中获取的复杂类型注入到ViewPage的构造函数中,因此很容易更改实现。这就是为什么我在寻找构建ViewPage的地方。
答案 0 :(得分:2)
你能看到使用MVC3吗?视图页面中的依赖注入是不可能的,因为创建深埋在视图引擎的实现中。
现在在MVC3中解决了这个问题。完整详情:http://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.html
答案 1 :(得分:0)
据我了解,您有责任,因为在View的定义中,您明确说明了您的视图的基类。
试试这个:
public sealed class MyViewPage : System.Web.Mvc.ViewPage
{
public string Herp {get{return "Derp";}}
}
并且,在您看来,这样做:
<%@ Page Language="C#" Inherits="MyApplication.MyViewPage" %>
<!-- compare the Inherits attribute in your standard View page -->
<%: Herp %>
我从来没有这样做,但我90%肯定它会起作用。您还需要执行通用版本:
public sealed class MyViewPage<T> : System.Web.Mvc.ViewPage<T> {}
答案 2 :(得分:0)
我将基本视图模型和DI放弃到ViewPage中以使用合成(通过ViewData []),因为它允许您比继承视图模型更灵活。想象一下,如果您以后想要向各种页面添加更多组件(标题,菜单,侧边栏,用户配置文件小部件等)。如果你必须将所有这些都融入到基本视图模型中,那么它将变得拥挤,你可能甚至不需要每个视图上的所有内容。我纯粹为渲染的特定视图使用该模型,然后将我的其他组件放入ViewData。示例视图代码:
<% var headerModel = ViewData[Constants.HeaderData] as HeaderViewModel %>
或超级简单的解决方案:您是否考虑在视图中使用ObjectFactory
? (这会让一些人 - 包括我自己 - 畏缩,但确实有效。)
ObjectFactory.GetInstance<IService>();