我正在为一个网页使用Model-View-Presenter模式。Presenter应该知道Session,还是只有View应该知道?
我的意思是,像Session这样的概念与视图的架构非常相关,所以它们是否应该限制在由视图使用?否则,如果我想在不同的架构上重用Presenter,会发生什么情况(或者除非我有计划这样做,否则我不需要担心)?
我正在为一个网页使用Model-View-Presenter模式。Presenter应该知道Session,还是只有View应该知道?
我的意思是,像Session这样的概念与视图的架构非常相关,所以它们是否应该限制在由视图使用?否则,如果我想在不同的架构上重用Presenter,会发生什么情况(或者除非我有计划这样做,否则我不需要担心)?
在我的MVP实现中,我会注入一个ICookieManager、ISessionManager、ICacheManager、IConfigurationManager和IRedirector到我的Presenter中,这些接口由封装了相应功能的类来实现。
这样可以创建一个Presenter,你可以注入模拟版本,并且不需要在Presenter中直接依赖于asp.net运行时,因此测试更加容易。
祝好!
我也正在研究被动 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。在这个例子中,视图知道如何存储它的状态。缺点是每次Presenter将数据放入View中时,都必须调用一个Update方法来强制重绑定。虽然在上面的例子中不需要这样做,但你也不需要管理一张会话表。我不确定这种方法是否会使使用模拟工具测试变得更加复杂。技巧是将每个可消耗的实体进行接口化。这样可以更容易地使用模拟测试演示器和模型,并将测试集中于行为。
这取决于您要重复使用或包含大部分业务逻辑的对象。
我认为只有Presenter应该知道会话,因为该对象是MVP中最接近控制器的东西。
是的,正如dove所说,将访问Session的任何内容都包装在另一个类中。
这意味着您可以注入此类型的模拟类以模拟Session的不同值。
更具体地回答您的问题,我倾向于采用监管者-主持人模式(http://martinfowler.com/eaaDev/SupervisingPresenter.html),使视图非常愚蠢。因此,只有Presenter会访问Session(虽然不是直接访问,就像我之前说的那样),并告诉View该做什么。