請參閱更新遠遠低於我在與基於事件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的狀態內存中,因爲我們在回發(並且自定義對象未存儲在會話或視圖狀態中)。
我的訂閱處理程序是否仍然存在並能夠捕獲此次提出的事件?或者在回發時他們被「處置」了嗎?
謝謝。
所以,最初我們有WebFormA和PresenterA。 PresenterA填充WebFormA,並訂閱webformA中的事件。 回發時,WebFormB和PresenterB被創建/連線,並且單擊事件被處理。這引發了PreformterB訂閱的WebformB事件,因此PresenterB中的處理程序被觸發。 與此同時,訂閱了WebformA事件的Presenter A可用於垃圾回收,因爲WebformA不再存在。 這是正確的嗎?我需要確定內存/垃圾,因爲我們最近一直在經歷內存泄漏。 – Milambardo
我認爲你是對的。 – Maarten