5

我正在为网页使用 Model-View-Presenter 模式。演示者应该知道 Session 还是应该只有视图知道它?

我想我得到的是像 Session 这样的概念与视图的体系结构非常相关,所以它们应该被限制为视图使用吗?否则,如果我想在不同架构的类似页面上重用演示者会发生什么(或者我不需要担心,除非我有计划这样做)?

4

7 回答 7

8

我在我的 MVP 实现中正在做类似的事情,我将 ICookieManager、ISessionManager、ICacheManager、IConfigurationManager、IRedirector 注入到我的演示者中,它们由包装为此功能的类实现。

这允许演示者在其中注入这些模拟版本,并且在演示者中对 asp.net 运行时没有直接依赖关系,因此它使测试更容易。

干杯

于 2008-11-03T12:53:34.110 回答
2

它甚至可以是一个共享模块,充当您正在使用的任何会话的包装器。通过这种方式,您的所有控制器都可以使用它,并且您可以简单地更改会话的物理实现。

您的演示者将使用控制器从会话中获取的任何内容填充视图。

于 2008-11-03T10:56:30.413 回答
1

谢谢大家的回答,总结一下。。。

我们是说实际上 Presenter应该能够从会话中访问数据(最好是通过接口)以及不应该访问它的视图(仍然是哑巴)?

于 2008-11-03T14:50:26.947 回答
0

取决于您尝试重用的对象或包含大部分业务逻辑的对象。

我假设只有演示者应该知道会话,因为该对象是 MVP 中最接近控制器的东西。

于 2008-11-03T10:53:18.500 回答
0

是的,正如鸽子所说,将访问 Session 的任何内容包装在另一个类中。

这意味着您可以注入这种类型的模拟类来模拟 Session 的不同值。

为了更具体地回答您的问题,我倾向于使用 Supervising-Presenter 模式(http://martinfowler.com/eaaDev/SupervisingPresenter.html),它使视图保持非常愚蠢。所以只有 Presenter 会访问 Session(虽然不是像我之前说的那样直接访问)并告诉 View 要做什么。

于 2008-11-03T12:45:31.350 回答
0

我也在研究被动 MVP 方法。我在网上看到过一些事情,它们都将会话持久性留给了视图——要么通过注入,如鸽子所提到的,要么显式管理。

可以在此处查看依赖注入示例: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 方法来强制重新绑定。在上面的示例中不需要这样做,但您不需要管理会话表。我不确定这种方法如何使使用模拟工具的测试变得复杂。

于 2008-11-17T21:53:25.223 回答
0

技巧是连接每个消耗品实体。它使演示者和模型更容易通过模拟进行测试,并将测试集中在行为上。

于 2008-12-18T18:57:37.940 回答