2012-09-13 44 views
0

請參閱更新遠遠低於我在與基於事件MVP方法問題的簡短描述MVP主持人訂閱事件回發後

。我有以下設置:

public class MeetingPresenter : IMeetingPresenter 
{ 
    IViewMeeting; 
    public MeetingPresenter(IViewMeeting view) 
    { 
     this.View = view; 
     PopulateViewData(); 
     this.View.MeetingSavedClicked += OnMeetingSavedClicked; 
    } 

    public void PopulateViewData() 
    { 
     Imeeting meeting = service.GetMeeting(); 
     view.SetMeetingDate(meeting.date); 
    } 

    private void OnMeetingSavedClicked() 
    { 
     service.SaveMeeting(view.GetMeeting()); 
    } 
} 


public interface IViewMeeting 
{ 
    void SetMeetingDate(Datetime date); 
    IMeeting GetMeeting(); 

    event Action MeetingSavedClicked; 
} 

,然後查看:(VB編寫的)

Partial Class MeetingPage 
Inherits System.Web.UI.Page 
Implements IViewMeeting 
{ 

     Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

      If Not IsPostBack Then 
       Presenter = New MeetingPresenter(Me) 
      Else 

      End If 
     End Sub 

     Private _presenter As IMeetingPresenter 
     Public Property Presenter() As IMeetingPresenter 
     Get 
      Return _presenter 
     End Get 
     Set(ByVal value As IMeetingPresenter) 
      _presenter = value 
     End Set 
     End Property 

     Public Sub SetMeetingDate(ByVal date As Datetime) Implements IMeetingVisits.SetMeetingDate 

      lblMeetingDate.Text = date.Date.ToString() 
     End Sub 
} 

     //Not implementing this fully - should get the idea 
     public Function GetMeeting as IMeeting Implements IMeetingVisits.GetMeeting 

     end function 

     Event MeetingSavedClicked As Action Implements IViewMeeting.MeetingSavedClicked 


     Public Sub btnSaveMeeting_Click(ByVal sender As Object, ByVal e As System.EventArgs) 

      RaiseEvent MeetingSavedClicked() 
     End Sub 
  • 繼續之前 - 我知道我可以在視圖中取出的依賴等,並任何模型都應該是查看特定的。 *

我遇到的問題是事件。我正在訂閱我的演示者中的View界面事件。負載視圖正在創建該演示者的具體版本,該演講者在短期內導致演示者填充所有視圖字段。到現在爲止還挺好。

問題是,當通過btnSaveMeeting_Click引發MeetingSavedClicked事件時,演示者中相應的訂閱方法未被觸發。這大概是因爲主持人已經不在記憶中了,因爲狀態在回傳之後沒有被維護。我不確定在主持人事件中的訂閱是否會導致它以某種方式留在內存中(我對自定義事件的瞭解並不多),但事實似乎並非如此。

然後,將演示者存儲在視圖狀態還是會話中是唯一的選擇嗎?這是否意味着事件訂閱仍然存在並執行?

道歉,如果這似乎很基本的,但我是一個有點與事件新手,MVP等

UPDATE 或許我可以讓這個更清晰了:

我的網頁表單實現具有行動事件的界面。

webform創建一個自定義對象,該對象具有訂閱此接口事件的方法。

回發時,在webform(後面的代碼)上引發一個單擊事件,然後引發實現的接口事件。

現在,自定義對象不再處於webform的狀態內存中,因爲我們在回發(並且自定義對象未存儲在會話或視圖狀態中)。

我的訂閱處理程序是否仍然存在並能夠捕獲此次提出的事件?或者在回發時他們被「處置」了嗎?

謝謝。

回答

0

在回發中使用的頁面對象是一個全新的頁面對象。它絕不會連接到您的舊頁面對象。爲了解決您的問題,您必須重新創建演示者,並且要再次將事件連接起來。

從技術上講,如果垃圾收集器尚未收集它們,舊的頁面對象和演示者對象以及它們之間的事件處理程序可能仍在內存中。但是沒有對這些對象的引用,並且它們將/可能在下一次GC運行中收集。

+0

所以,最初我們有WebFormA和PresenterA。 PresenterA填充WebFormA,並訂閱webformA中的事件。 回發時,WebFormB和PresenterB被創建/連線,並且單擊事件被處理。這引發了PreformterB訂閱的WebformB事件,因此PresenterB中的處理程序被觸發。 與此同時,訂閱了WebformA事件的Presenter A可用於垃圾回收,因爲WebformA不再存在。 這是正確的嗎?我需要確定內存/垃圾,因爲我們最近一直在經歷內存泄漏。 – Milambardo

+0

我認爲你是對的。 – Maarten