【发布时间】:2008-11-03 10:44:49
【问题描述】:
我正在为网页使用模型-视图-演示者模式。演示者应该知道 Session 还是应该只有视图知道它?
我想我得到的是像 Session 这样的概念与视图的架构非常相关,所以它们是否应该被限制为视图使用?否则,如果我想在不同架构的类似页面上重用演示者会发生什么(或者我不需要担心,除非我有计划这样做)?
【问题讨论】:
标签: web-applications session mvp
我正在为网页使用模型-视图-演示者模式。演示者应该知道 Session 还是应该只有视图知道它?
我想我得到的是像 Session 这样的概念与视图的架构非常相关,所以它们是否应该被限制为视图使用?否则,如果我想在不同架构的类似页面上重用演示者会发生什么(或者我不需要担心,除非我有计划这样做)?
【问题讨论】:
标签: web-applications session mvp
我在我的 MVP 实现中正在做类似的事情,我将 ICookieManager、ISessionManager、ICacheManager、IConfigurationManager、IRedirector 注入到我的演示者中,它们由包装此功能的类实现。
这允许演示者在其中注入这些模拟版本,并且您的演示者中没有对 asp.net 运行时的直接依赖,因此它使测试更容易。
干杯
【讨论】:
它甚至可以是一个共享模块,充当您正在使用的任何会话的包装器。这样一来,您的所有控制器都可以使用它,并且您可以简单地更改会话的物理实现。
您的演示者将使用控制器从会话中获取的任何内容填充视图。
【讨论】:
感谢大家的回答,总结一下……
我们是说实际上 Presenter应该 能够访问会话中的数据(最好通过接口)及其不应该访问它的视图(保持沉默)?
【讨论】:
取决于您尝试重用的对象或包含大部分业务逻辑的对象。
我假设只有演示者应该知道会话,因为该对象是 MVP 中最接近控制器的东西。
【讨论】:
是的,正如 dove 所说,将访问 Session 的任何内容包装在另一个类中。
这意味着您可以注入这种类型的模拟类来模拟不同的 Session 值。
为了更具体地回答您的问题,我倾向于使用监督演示者模式 (http://martinfowler.com/eaaDev/SupervisingPresenter.html),这会使视图保持非常愚蠢。所以只有 Presenter 会访问 Session(虽然不是像我之前说的那样直接访问)并告诉 View 要做什么。
【讨论】:
我也在研究被动 MVP 方法。我在网络上看到过一些事情,它们都将会话持久性留给了视图——要么通过注入,如 dove 所提到的,要么显式管理。
可以在此处查看依赖注入示例:http://www.codeproject.com/KB/aspnet/Advanced_MVP.aspx 和此处:http://geekswithblogs.net/opiesblog/archive/2006/06/30/83743.aspx。这里的技巧是在一个静态变量中管理所有会话实例,并防止它们相互覆盖。 (我不确定第一个示例是否正确完成此操作。)
第二种方法在这里:http://codebetter.com/blogs/jeffrey.palermo/archive/2005/03/28/128592.aspx。在这个例子中,视图知道如何存储它的状态。缺点是每次演示者将数据放入视图时,它都必须在视图上调用 Update 方法来强制重新绑定。在上面的示例中不需要这样做,但您不需要管理会话表。我不确定这种方法如何使使用模拟工具进行测试变得复杂。
【讨论】:
提示是连接每个消耗性实体。它使演示者和模型更容易通过模拟进行测试,并将测试重点放在行为上。
【讨论】: