MVP - Presenter是否应该使用Session?

5

我正在为一个网页使用Model-View-Presenter模式。Presenter应该知道Session,还是只有View应该知道?

我的意思是,像Session这样的概念与视图的架构非常相关,所以它们是否应该限制在由视图使用?否则,如果我想在不同的架构上重用Presenter,会发生什么情况(或者除非我有计划这样做,否则我不需要担心)?

7个回答

8

在我的MVP实现中,我会注入一个ICookieManager、ISessionManager、ICacheManager、IConfigurationManager和IRedirector到我的Presenter中,这些接口由封装了相应功能的类来实现。

这样可以创建一个Presenter,你可以注入模拟版本,并且不需要在Presenter中直接依赖于asp.net运行时,因此测试更加容易。

祝好!


2
即使是一个共享模块,它也可以作为一个包装器来使用任何你正在使用的会话。这样它就可以为所有控制器提供,并且你可以轻松更改会话的物理实现。
您的Presenter将使用控制器从会话中获取的数据填充视图。

1
感谢大家的回答,总结一下...
我们是不是在说其实 Presenter 应该能够访问 session 中的数据(最好通过接口),而视图不应该访问它(保持愚笨)?

这是我的观点,没错。 - Duncan

0

我也正在研究被动 MVP 的方法。我在网上看到了一些做法,都是把会话保持留给视图-通常通过注入或明确管理实现。

这里可以看到依赖注入的例子:http://www.codeproject.com/KB/aspnet/Advanced_MVP.aspxhttp://geekswithblogs.net/opiesblog/archive/2006/06/30/83743.aspx。关键在于要在静态变量中管理所有会话实例,并防止它们互相覆盖。(我不确定第一个示例是否正确实现了这一点。)

第二种方法在这里:http://codebetter.com/blogs/jeffrey.palermo/archive/2005/03/28/128592.aspx。在这个例子中,视图知道如何存储它的状态。缺点是每次Presenter将数据放入View中时,都必须调用一个Update方法来强制重绑定。虽然在上面的例子中不需要这样做,但你也不需要管理一张会话表。我不确定这种方法是否会使使用模拟工具测试变得更加复杂。

0

技巧是将每个可消耗的实体进行接口化。这样可以更容易地使用模拟测试演示器和模型,并将测试集中于行为。


0

这取决于您要重复使用或包含大部分业务逻辑的对象。

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


0

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

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

更具体地回答您的问题,我倾向于采用监管者-主持人模式(http://martinfowler.com/eaaDev/SupervisingPresenter.html),使视图非常愚蠢。因此,只有Presenter会访问Session(虽然不是直接访问,就像我之前说的那样),并告诉View该做什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接