0

簡単な説明については、以下のアップデートを参照してください。

イベント ベースの 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 インターフェイス イベントをサブスクライブしています。ビューは、ロード時に、このプレゼンターの具体的なバージョンを作成しています。これにより、プレゼンターはすべてのビュー フィールドにデータを入力します。ここまでは順調ですね。

問題は、MeetingSavedClicked イベントが btnSaveMeeting_Click によって発生したときに、プレゼンターの対応するサブスクライブ メソッドが起動されないことです。ポストバック後に状態が維持されないため、プレゼンターがメモリに存在しなくなったためと考えられます。プレゼンターイベントのサブスクリプションが何らかの形でメモリに残るかどうかはわかりませんでしたが(カスタムイベントについてはよくわかりません)、そうではないようです.

その場合、プレゼンターをビューステートまたはセッションに保存する唯一のオプションはありますか? これは、イベント サブスクリプションが引き続き存在し、実行されることを意味しますか?

これが非常に基本的なように思われる場合は申し訳ありませんが、私はイベントや MVP などの初心者です。

更新おそらく、これをもう少し明確にすることができます:

私の Web フォームは、アクション イベントを持つインターフェイスを実装しています。

Web フォームは、このインターフェイス イベントにサブスクライブされたメソッドを持つカスタム オブジェクトを作成します。

ポストバック時に、Web フォーム (コード ビハインド) でクリック イベントが発生し、実装されたインターフェイス イベントが発生します。

これで、カスタム オブジェクトは Web フォームのステート メモリになくなりました。これは、ポストバックしているためです (カスタム オブジェクトはセッションまたはビューステートに保存されていません)。

サブスクライブしたハンドラーは引き続き存在し、この発生したイベントをキャッチできる必要がありますか? それとも、ポストバックの時までに「処分」されましたか?

ありがとう。

4

1 に答える 1

0

ポストバックで使用されるページ オブジェクトは、まったく新しいページ オブジェクトです。古いページオブジェクトには決して接続されていません。問題を解決するには、プレゼンターを再作成する必要があり、イベントを再度配線する必要があります。

技術的には、ガベージ コレクターがまだそれらを収集していない場合、古いページ オブジェクトとプレゼンター オブジェクト、およびそれらの間のイベント ハンドラーがまだメモリ内にある可能性があります。ただし、これらのオブジェクトへの参照はなく、次の GC 実行で収集される可能性があります。

于 2012-09-13T13:20:06.187 に答える