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

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

有帮助吗?

解决方案

我在MVP实现中做了类似的事情我将ICookieManager,ISessionManager,ICacheManager,IConfigurationManager,IRedirector注入到我的演示者中,这些是由包含此功能的类实现的。

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

干杯

其他提示

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

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

感谢大家的回答,总结一下......

我们是否说Presenter 应该能够从会话中访问数据(最好是通过接口)以及不应该访问它的视图(保持愚蠢)?

取决于您尝试重复使用哪个对象或以其他方式包含大部分业务逻辑。

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

是的,正如鸽子所说,包裹任何访问另一个类的Session。

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

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

我也正在研究被动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方法以强制重新绑定。上面的示例中不需要这样做,但您不需要管理会话表。我不确定这种方法如何使用模拟工具使测试变得复杂。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top