请参阅下面的更新以获得更简短的描述
我对基于事件的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
- 在继续之前,我意识到我可以去掉视图中的依赖项等,并且任何模型都应该是特定于视图的*
我遇到的问题是事件。我正在订阅演示者中的"查看"界面事件。加载后的视图将创建此演示者的具体版本,这将导致演示者填充所有视图字段。到目前为止还不错。
问题是,当MeetingSavedClicked事件通过btnSaveMeeting_Click引发时,presenter中相应的订阅方法不会被激发。这可能是因为演示者已不在内存中,因为状态在回发后不会保持。我不确定订阅演示者活动是否会以某种方式让它留在记忆中(我真的对自定义活动了解不多),但事实似乎并非如此。
那么,唯一的选择是将演示者存储在视图状态或会话中吗?这是否意味着事件订阅仍将存在并执行?
如果这看起来很基本,我很抱歉,但我对赛事、MVP等有点新手。
更新也许我可以更清楚一点:
我的webform实现了一个具有操作事件的接口。
Web窗体创建一个自定义对象,该对象具有订阅此接口事件的方法。
在回发时,在webform上引发一个点击事件(代码隐藏),这反过来又引发实现的接口事件。
现在,自定义对象不再在webform的状态内存中,因为我们正在回发(并且自定义对象不存储在会话或视图状态中)。
我订阅的处理程序是否仍然存在并能够捕获此引发的事件?或者在回邮时它们已经被"处理"了
谢谢。
回发中使用的页面对象是一个全新的页面对象。它根本没有连接到您的旧页面对象。为了解决你的问题,你必须重新创建你的演示者,你必须再次连接事件。
从技术上讲,如果垃圾收集器还没有收集到旧的页面对象和演示者对象,以及它们之间的事件处理程序可能仍在内存中。但是没有对这些对象的引用,它们将/可能在下一次GC运行中被收集。