请参阅下面的更新以获得更简短的描述
我在使用基于事件的 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 事件时,不会触发 Presenter 中相应的订阅方法。这大概是因为演示者不再在内存中,因为回发后状态不会保持。我不确定 Presenter 事件中的订阅是否会导致它以某种方式留在内存中(我真的不太了解自定义事件),但似乎情况并非如此。
那么,将演示者存储在视图状态或会话中是唯一的选择吗?这是否意味着事件订阅仍将存在并执行?
抱歉,如果这看起来很基本,但我对事件、MVP 等有点新手。
更新也许我可以让这更清楚一点:
我的网络表单实现了一个具有动作事件的界面。
Web 表单创建一个自定义对象,该对象具有订阅此接口事件的方法。
在回发时,会在 webform 上引发 click 事件(代码隐藏),这反过来会引发已实现的界面事件。
现在,自定义对象不再位于 webform 的状态内存中,因为我们处于回发状态(并且自定义对象未存储在会话或视图状态中)。
我订阅的处理程序是否仍然存在并且能够捕捉到这个引发的事件?还是在回发时它们已被“处理”?
谢谢。