パッシブビューを使用するいくつかの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.
}
}
書き込み専用のプロパティで合意しました。私はそれらを見ると私にバグがあり、複雑なビューよりも定型コードが多く追加されています。 –
しかし、イベントを使用する際には、Presenterが処理する必要のあるデータを格納するために、特定の 'ModelDataChangedEventArgs'クラスを作成する必要があります。多くの出来事があるとき、ボイラープレートのクラス数が爆発的に増加します。 'Action MyDelegate'は' EventHandler MyEvent'に変更する必要があります.1:1マッピングなので、呼び出しリストをクリアする確率は非常に限られています... –