2008-11-03 39 views
5

我正在为网页使用模型 - 视图 - 演示者模式。演示者是否应该了解Session,还是应该只有该视图才能意识到这一点?MVP - 演示者是否应使用Session?

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

回答

8

我在我的MVP实现中做了这样的事情我在我的演示器中注入了一个ICookieManager,ISessionManager,ICacheManager,IConfigurationManager,IRedirector,这些类由实现此功能的类实现。

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

干杯

0

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

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

2

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

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

0

是的,正如鸽子说的那样,将任何访问会话都包装在另一个类中。

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

若要更具体地回答您的问题,我倾向于采用监督 - 演示者模式(http://martinfowler.com/eaaDev/SupervisingPresenter.html),该模式将视图保持为非常愚蠢。所以只有Presenter才能访问会话(尽管不是像我之前说的那样直接)并告诉View需要做什么。

1

谢谢您的回答大家,所以总结...

难道我们说,其实主持人应该能(最好通过一个接口)从会话中访问数据和其不应该访问它的视图(保持哑巴)?

+0

这是我的意见,是的。 – Duncan 2008-11-06 09:01:03

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方法来强制重新绑定。这在上面的示例中不需要,但您不需要管理会话表。我不确定这种方法如何使用嘲讽工具进行测试变得复杂。

0

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

相关问题