代码之家  ›  专栏  ›  技术社区  ›  Milambardo

MVP演示者在回发后订阅了活动

  •  0
  • Milambardo  · 技术社区  · 12 年前

    请参阅下面的更新以获得更简短的描述

    我对基于事件的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等有点新手。

    更新 也许我可以说得更清楚一点:

    我的web表单实现了一个具有操作事件的接口。

    Web窗体创建一个自定义对象,该对象具有订阅此接口事件的方法。

    在回发时,在webform上引发一个点击事件(代码隐藏),这反过来又引发实现的接口事件。

    现在,自定义对象不再在webform的状态内存中,因为我们正在回发(并且自定义对象未存储在会话或视图状态中)。

    我订阅的处理程序是否应该仍然存在并能够捕获此引发的事件?还是在回邮时它们已经被“处理”了?

    谢谢

    1 回复  |  直到 12 年前
        1
  •  0
  •   Maarten    12 年前

    回发中使用的页面对象是一个全新的页面对象。它根本没有连接到您的旧页面对象。为了解决你的问题,你必须重新创建你的演示者,你必须再次连接事件。

    从技术上讲,如果垃圾收集器还没有收集到旧的页面对象和演示者对象,以及它们之间的事件处理程序可能仍在内存中。但是没有对这些对象的引用,它们将/可能在下一次GC运行中被收集。