将CancelableEvent转换为RX

时间:2015-10-20 13:49:02

标签: c# system.reactive

目前我尝试通过从组件发送单向消息来考虑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位于控制器中,只显示和关闭不同的窗口和对话框。

1 个答案:

答案 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));