我过去只在视图中有一个ApplyPresenter()
方法,但从技术上讲,如果视图知道演示者并调用它上的方法,那就不是被动视图。
因此,我可以从视图中公开一个事件,而不是调用presenter.AButtonClicked()
,比如event EventHandler AButtonClicked
,然后演示者订阅它
但是我在哪里订阅AButtonClicked
?如果构造函数除了字段赋值之外不应该做任何工作,那么我就不能在构造函数中做。我可以在我的演示者上有一个Initialize()
方法(或者可能称之为Setup()
),但这不是一种代码气味吗?
我应该在构造函数中做一些额外的工作,并在那里订阅视图的事件吗?
我应该在构造函数中做一些额外的工作,并在那里订阅视图的事件吗?
您可以在构造函数中执行此操作——这是执行事件绑定的好地方。
或者您可以引入一个事件代理,比如IEventBroker,它允许您的组件发布和订阅事件。
主讲人:
public MyPresenter(
IEventBroker eventBroker, ...)
{
this.eventBroker = eventBroker;
this.eventBroker.Subscribe("UpdateButtonClicked", this.WhenButtonClicked);
}
在视图中:
public MyView(
IEventBroker eventBroker, ...)
{
this.eventBroker = eventBroker;
}
private void someButton_Click(object sender, EventArgs e)
{
this.eventBroker.Fire("UpdateButtonClicked", new EventArgs<Item>(lineID));
}
或者你可以说人们经常将被动视图定义为
不负责从模型更新自身的视图
它没有说明视图对控制器/演示者的了解。因此,您可以保持ApplyPresenter()
方法不变。