2012-04-30 14 views
7

パッシブビューを使用するいくつかのWinFormsアプリケーションでMVPパターンを実装しました。私は具体的なビューでUIイベントを接続し、プレゼンターにコールバックするために、プロパティーとデリゲートを含むインターフェースを実装して、アクション< T>とFunc < T>の形式で実装します。MVP、Winforms - イベントハンドラまたはデリゲート

私は新しいプロジェクトを開始しようとしており、パターンの多くの例を含むパターンをオンラインで少し研究し、すべてがイベントハンドラを使用して発表者に通知することに注意してください。

なぜ私は1人の司会者しか持たないと見ているので、この場合にイベントが使われる理由は分かりません。

私の質問は、.Netフレームワークがどのようにイベントを使用するか、または私が見ていない他の理由で一貫しているためですか?ここで

は、私が使用したパターンの簡単な例です:

public interface IViewAbstraction 
{ 
    public ModelData ModelData { set; } 
    public Action<ModelData> ModelDataChangedCallback { set; } 
} 

public class SomeWinForm : Form, IViewAbstraction 
{ 
    private Action<ModelData> modelDataChanged; 
    private ModelData model; 

    public ModelData ModelData 
    { 
     set { /* when this property changes, update UI */ } 
    } 

    public Action<ModelData> ModelDataChangedCallback 
    { 
     set { modelDataChanged = value; } 
    } 

    private void OnSomeWinformsEvent(EventArgs args) 
    { 
     if (modelDataChanged == null) throw new Exception(); 

     modelDataChanged(model); 
    } 
} 

public class Presenter 
{ 
    private readonly IViewAbstraction view; 
    private readonly IDataLayerAbstraction dataLayer; 

    public Presenter(IViewAbstraction view, IDataLayerAbstraction dataLayer) 
    { 
     this.dataLayer = dataLayer; 
     this.view = view; 
     this.view.ModelDataChangedCallback = OnModelChanged; 
     this.view.ModelData = dataLayer.GetData(); 
    } 

    private void OnModelChanged(ModelData data) 
    { 
     // validate and save data. 
    } 
} 

答えて

4

あなたのパターンは、本質的に重要な違いで、イベントを使用するのと同じです。イベントは、基になるデリゲート(あなたの例ではModelDataChangedCallback)を公開しません。これを公開することは、他のコードが呼び出しリストをクリアできるなどの悪い習慣です。イベントには、追加または削除することはできますが、クラスのスコープの外部から決してクリアすることはできない、基本となるデリゲートがあります。

複数のユーザがいないということについて私は理解できません。これはイベントを使用しない理由ではありません。イベントは、クラスが「こんにちは!このことが起こった」と言う方法です.Presenterオブジェクトとの1対1のマッピングは完全に合理的かつ正常です。

また、ビューでは、かなり奇妙な見た目の書き込み専用プロパティで終わることもありません。

+0

書き込み専用のプロパティで合意しました。私はそれらを見ると私にバグがあり、複雑なビューよりも定型コードが多く追加されています。 –

+0

しかし、イベントを使用する際には、Presenterが処理する必要のあるデータを格納するために、特定の 'ModelDataChangedEventArgs'クラスを作成する必要があります。多くの出来事があるとき、ボイラープレートのクラス数が爆発的に増加します。 'Action MyDelegate'は' EventHandler MyEvent'に変更する必要があります.1:1マッピングなので、呼び出しリストをクリアする確率は非常に限られています... –

関連する問題