最近、 Presenter Firstについて知り、ホワイトペーパーやブログなどを読みました。
私が見つけたほとんどの例では、イベントはインターフェース上で直接宣言されるのではなく、そのためのメソッドとして宣言されます。例えば、
public interface IPuzzleView
{
void SubscribeMoveRequest(PointDelegate listener);
// vs
event PointDelegate MoveRequest;
}
理由はよくわかりません。この背後にある理由を説明する紙/記事/ブログをどこかで見たと思いましたが、もう見つかりません。上記のテキストには、単体テストコードのスニペットも含まれていました。これは、単体テストの1つが間違っていたと自分に言い聞かせたことを覚えているからです。
アップデート:
以下は比較のための例です。
public class Collect
{
public static CollectAction<T> Argument<T>(int index,
CollectAction<T>.Collect collectDelegate)
{
CollectAction<T> collect = new CollectAction<T>(index, collectDelegate);
return collect;
}
}
public interface IApplicationView
{
event EventHandler Load;
// or
void SubscribeLoad(Action action);
}
Mockery mockery = new Mockery();
IApplicationView view = mockery.NewMock<IApplicationView>();
IApplicationModel model = mockery.NewMock<IApplicationModel>();
購読スタイル:
Action savedAction = null;
Expect.Once.On(view).Method("SubscribeLoad").Will(
Collect.Argument<Action>(0,
delegate(Action action) { savedAction = action; }));
Expect.Once.On(model).Method("LoadModules");
new ApplicationPresenter(view, model);
savedAction();
mockery.VerifyAllExpectationsHaveBeenMet();
対イベント:
Expect.Once.On(view).EventAdd("Load", Is.Anything);
Expect.Once.On(model).Method("LoadModules");
new ApplicationPresenter(view, model);
Fire.Event("Load").On(view);
mockery.VerifyAllExpectationsHaveBeenMet();
参考までに、ApplicationPresenterはすぐにガベージコレクションされ、配線が行われないため、上記のイベントスタイルはそのままでは機能しません。