2008-11-03 42 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

提示是連接每個可消耗實體。它使演示者和模型更容易通過嘲諷進行測試,並將測試集中在行爲上。

相關問題