将 CancelableEvent 转换为 RX

Translate CancelableEvent to RX

目前我尝试通过仅从组件发送单向消息来思考响应式扩展方式。但我仍然没有弄清楚如何使用 CancelableEventArgs 实现一些依赖于注册处理程序同步执行到与 rx 一起工作的解决方案的东西。

示例:

public void Delete()
{
    var deleteRequest = new DeleteServerRequest(_serverConfigurationMapper.Map(SelectedServer)); 
    _eventStream.Push(deleteRequest);
    if (!deleteRequest.Cancel)
        _serverConfigurationRepository.Delete(deleteRequest.Server);
}

在另一个 class 中,我在 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 在控制器中,只应显示和关闭不同的 windows 和对话框。

当然可以,只需将取消移到下游即可。

_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));

我个人不是 "merge all events into a single stream" 方法的忠实拥护者,虽然它是有效的,但我会创建一个专门用于删除的流,然后将请求创建也包装在其中。这也将有助于消除在 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));