13

所以我一直在到处阅读使用Subject<T>“不好”的地方——我有点同意这个推理。

但是,我正在尝试考虑避免使用它的最佳方法并举一个例子。

目前,我的持久化配置类有一个抽象类,它上面有一个受保护的Save()方法,只要更改属性应该持久化类,就会调用该方法。此消息将消息泵入Subject<T>通过IObservable<T>序列化服务侦听和序列化类的接口公开的消息。这在当时似乎是最明显、最简单、最快捷的实现方式。

那么不使用主题的 RX 方法是什么?我会改为公开一个事件并使用Observable.FromEventPattern()它来订阅它吗?- 因为这似乎是一种更复杂的方法。

4

2 回答 2

16

与其说使用不好,不如说Subject<T>是不好——必须有某种“进入 monad”的方式——这是学术上所说的“get an IObservable<T>。你需要从某个地方开始。

Subject<T>当从订阅中使用它而不是将现有的 observables 链接在一起时,问题会更多地出现。受试者应该只存在于您的 Rx 机器的边缘。

如果提供的入口点(例如FromEventFromEventPatternFromAsyncReturnToObservable())都不适合您,那么使用Subject<T>是完全有效的。并且没有必要仅仅为了方便使用上述之一而增加额外的复杂性——无论如何,它们中的大多数都使用主题或类似主题的结构。

在你的情况下,听起来就好Subject<T>了。AsObservable()为了隐藏实现细节,您可能会看什么来公开它。

于 2014-02-17T08:58:21.063 回答
2

进入 observable 的一种简单方法是通过 Action

private Action<ObservableArgs> _action;

创建可观察的

public IObservable<ObservableArgs> GetObservable()
{
    return Observable.FromEvent<ObservableArgs>>(
                ev => _action += ev, 
                ev => _action -= ev);
}

然后添加到可观察使用

public void OnNext(ObservableArgs args)
{
    _action?.Invoke(args);
}
于 2018-06-22T08:09:16.320 回答