C# 如何避免在RX中使用主题

C# 如何避免在RX中使用主题,c#,system.reactive,subject,C#,System.reactive,Subject,所以我到处都在读,使用主题是“不好的”-我有点同意这种推理 然而,我正试图想出避免使用它的最佳方法,并举了一个例子 目前,我有一个用于持久化配置类的抽象类,该类上有一个受保护的Save()方法,每当更改属性时都会调用该方法来持久化该类。此消息将消息传送到主题,该主题通过序列化服务侦听并序列化该类的IObservable接口公开。这似乎是当时最明显、最简单、最快捷的实现方法 那么,在不使用主题的情况下,RX是如何做到这一点的呢?我是否会公开一个事件并使用Observable.FromEventPa

所以我到处都在读,使用
主题
是“不好的”-我有点同意这种推理

然而,我正试图想出避免使用它的最佳方法,并举了一个例子

目前,我有一个用于持久化配置类的抽象类,该类上有一个受保护的
Save()
方法,每当更改属性时都会调用该方法来持久化该类。此消息将消息传送到
主题
,该主题通过序列化服务侦听并序列化该类的
IObservable
接口公开。这似乎是当时最明显、最简单、最快捷的实现方法


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

与其说
主题的使用不好,还不如说是有某种方式“进入单子”——这是学术上说的“获得一个
可观察的
”的方式。你需要从某个地方开始

Subject
在订阅中使用而不是将现有的可观察对象链接在一起时会出现更多的问题。主题应该只存在于Rx机器的边缘

如果提供的入口点(例如
FromEvent
FromEventPattern
FromAsync
Return
ToObservable()
等)都不适用于您,那么使用
主题
是完全有效的。没有必要仅仅为了方便使用上述其中一种而增加额外的复杂性——它们中的大多数都在封面下使用主题或类似主题的结构


在您的情况下,听起来像
主题
就可以了。为了隐藏实现细节,您可能需要考虑通过什么来公开它。

输入可观察对象的简单方法是通过操作

private Action<ObservableArgs> _action;

作为一个有趣的问题,你能把其中的一些论点联系起来吗?我想我知道的Rx不足以回答这个问题,但这是我第一次听说你应该尽量避免使用
Subject
@shambulator查看这个链接以获得一个快速的解释:投票支持直接回答这个问题,并说明为什么你不应该避免使用
Subject
s。因为否则你会得到不必要的复杂代码,这会让每个人都对它的意图感到困惑,可能包括几个月后的作者本人。
public IObservable<ObservableArgs> GetObservable()
{
    return Observable.FromEvent<ObservableArgs>>(
                ev => _action += ev, 
                ev => _action -= ev);
}
public void OnNext(ObservableArgs args)
{
    _action?.Invoke(args);
}