如何避免在RX中使用Subjects

所以我一直在读到使用Subject是“坏”的 – 并且我赞同这个推理。

但是,我试图想出避免使用它的最佳方法,并举一个例子。

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

那么在不使用主题的情况下,RX方式会是什么呢? 我是否会公开一个事件并使用Observable.FromEventPattern()来订阅它? – 因为这似乎是一种更复杂的方式。

使用Subject并不是很糟糕 – 必须有某种方式“进入monad” – 这就是说“获得IObservable的学术方式。 你需要从某个地方开始。

当从订阅中使用Subject而不是将现有的observable链接在一起时, Subject的问题就会出现。 主题应该只存在于你的Rx机器的边缘。

如果没有提供的入口点(例如FromEventFromEventPatternFromAsyncReturnToObservable()等)为您工作,那么使用Subject是完全有效的。 并且没有必要为了便于使用上述其中一个而增加额外的复杂性 – 无论如何,它们中的大多数都使用主题或类似主题的结构。

在你的情况下,像Subject这样的声音就好了。 您可能会看到通过AsObservable()公开它以隐藏实现细节。

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

 private Action _action; 

创建可观察的

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

然后使用添加到observable

 public void OnNext(ObservableArgs args) { _action?.Invoke(args); }