目前我尝试通过从组件发送单向消息来考虑Reactive Extensions方式。但是我仍然没有弄清楚如何用CancelableEventArgs实现一些东西,它依赖于注册处理程序的同步执行到与rx一起使用的解决方案。
示例:
public void Delete()
{
var deleteRequest = new DeleteServerRequest(_serverConfigurationMapper.Map(SelectedServer));
_eventStream.Push(deleteRequest);
if (!deleteRequest.Cancel)
_serverConfigurationRepository.Delete(deleteRequest.Server);
}
在另一个类中,我在DeleteServerRequest上注册并显示提示,以便用户可以取消删除该项目。
_eventStream.Of<DeleteServerRequest>().Subscribe(
req =>
req.Cancel = DilaogResult.Yes != MessageBox.Show("Delte Server?",
"Do you want to delete the server?",
MessageBoxButtons.YesNo))
如果只使用RX中的一个定向消息传递,我将如何做这样的事情?
PS: Delete方法是ViewModel中命令的实现,所以我不想将UI-Framework代码带入其中。 EventHandler位于控制器中,只显示和关闭不同的窗口和对话框。
答案 0 :(得分:1)
当然,您可以执行此操作,只需将取消下移。
_eventStream.Of<DeleteServerRequest>()
.Map(req => {
req.Cancel = DialogResult.Yes != MessageBox.Show("Delete Server?",
"Do you want to delete the server?",
MessageBoxButtons.YesNo));
return req;
})
.Filter(x => !x.Cancel)
.Publish().RefCount()
.Subscribe(x => _serverConfigurationRepository.Delete(x.Server));
我个人并不是“将所有事件合并为单个流”方法的忠实粉丝,虽然它是有效的,但我会专门为删除创建一个流,然后将请求创建包装在其中。这也有助于消除在操作过程中被拉入Observable的副作用。在这种情况下Delete
看起来像
public void Delete()
{
_deleteStream.Push(SelectedServer);
}
流将看起来像:
_deleteStream
.Map(selected => new DeleteServerRequest(_serverConfigurationMapper.Map(selected)))
.Map(req => {
req.Cancel = DialogResult.Yes != MessageBox.Show("Delete Server?",
"Do you want to delete the server?",
MessageBoxButtons.YesNo));
return req;
})
.Filter(x => !x.Cancel)
.Publish().RefCount()
.Subscribe(x => _serverConfigurationRepository.Delete(x.Server));