MVP主持人在回发后订阅了事件

时间:2012-09-13 10:03:31

标签: c# events event-handling webforms 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等中取出依赖项,并且任何模型都应该是View特定的。 *

我遇到的问题是事件。我正在我的演示者中订阅View界面事件。加载时,视图正在创建此演示者的具体版本,这在某种程度上会导致演示者填充所有视图字段。到现在为止还挺好。

问题是当通过btnSaveMeeting_Click引发MeetingSavedClicked事件时,不会触发演示者中相应的订阅方法。这可能是因为演示者不再在内存中,因为在回发后状态不会被维护。我不确定presenter事件中的订阅是否会导致它以某种方式留在内存中(我真的不太了解自定义事件),但似乎情况并非如此。

然后,唯一的选择是将演示者存储在视图状态或会话中吗?这是否意味着事件订阅仍然存在并执行?

道歉,如果这看起来很基本,但我对事件,MVP等有点新手。

UPDATE 也许我可以让这个更清楚一点:

我的webform实现了一个具有动作事件的界面。

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

在回发时,会在webform(后面的代码)上引发一个click事件,这反过来会引发已实现的接口事件。

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

我订阅的处理程序是否仍然在那里并且能够捕获这个引发的事件?或者他们在回发时被“处理”了?

感谢。

1 个答案:

答案 0 :(得分:0)

回发中使用的页面对象是一个全新的页面对象。它绝不会连接到您的旧页面对象。要解决您的问题,您必须重新创建演示者,然后再次将事件连接起来。

从技术上讲,如果垃圾收集器尚未收集它们,那么旧的page-object和presenter-object以及它们之间的eventhandler可能仍然在内存中。但是没有对这些对象的引用,它们将/可能会在下一次GC运行中收集。