如何避免在RX中使用Subjects
所以我一直在读到使用Subject
是“坏”的 – 并且我赞同这个推理。
但是,我试图想出避免使用它的最佳方法,并举一个例子。
目前,我有一个持久化配置类的抽象类,它有一个受保护的Save()
方法,只要更改属性应该保持类,就会调用该方法。 此消息将消息泵送到Subject
,通过IObservable
接口公开,序列化服务侦听并序列化该类。 这似乎是当时实现这一目标的最明显,最简单,最快捷的方式。
那么在不使用主题的情况下,RX方式会是什么呢? 我是否会公开一个事件并使用Observable.FromEventPattern()
来订阅它? – 因为这似乎是一种更复杂的方式。
使用Subject
并不是很糟糕 – 必须有某种方式“进入monad” – 这就是说“获得IObservable
”的学术方式。 你需要从某个地方开始。
当从订阅中使用Subject
而不是将现有的observable链接在一起时, Subject
的问题就会出现。 主题应该只存在于你的Rx机器的边缘。
如果没有提供的入口点(例如FromEvent
, FromEventPattern
, FromAsync
, Return
, ToObservable()
等)为您工作,那么使用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); }