我可以使用反应式扩展进行独立订阅/发布吗?

本文关键字:布吗 独立 可以使 反应式 扩展 我可以 | 更新日期: 2023-09-27 18:31:29

假设我有一些类MyClass。在我的代码的一部分中,我想要这样的东西:

Observable.Subscribe<MyClass>(myClass => DoSomething(myClass));

然后在另一个地方(文件/项目/时间),我有这样的东西:

Observable.Publish(instanceOfMyClass);

第二行触发使用该确切类类型订阅的所有方法。这是反应式扩展(v1 或 v2)支持的功能吗?

将同步上下文指定为订阅调用的一部分会很有用。在那里指定该方法是否应该使用 WeakReference 保存也会很好。Publish 方法应该能够同步完成所有操作,或者给我一些可以等待的东西。

我可以使用反应式扩展进行独立订阅/发布吗?

这并不难创建。

您只需要一个内部Dictionary<Type, Object>,并使用它来存储每个Subject<T>(作为对象)Type

然后,您可以只编写两个SubscribePublish方法来处理内部字典。

其实应该很简单。


与其说它很简单,我想我会试一试。

这是我的 Rx 发布/子类:

public static class RxPS
{
    private static Dictionary<Type, object> _subjects
        = new Dictionary<Type, object>();
    public static IDisposable Subscribe<T>(Action<T> observer)
    {
        lock(_subjects)
        {
            if (!_subjects.ContainsKey(typeof(T)))
            {
                _subjects.Add(typeof(T), new Subject<T>());
            }
            return (_subjects[typeof(T)] as Subject<T>)
                .Subscribe(observer);
        }
    }
    public static void Publish<T>(T item)
    {
        lock(_subjects)
        {
            if (_subjects.ContainsKey(typeof(T)))
            {
                (_subjects[typeof(T)] as Subject<T>)
                    .OnNext(item);
            }
        }
    }
}

这就是它的使用方式:

RxPS.Publish(1);
var d = RxPS.Subscribe<int>(x => Console.WriteLine(x)); 
RxPS.Publish(2);
d.Dispose();
RxPS.Publish(3);

结果是此代码将仅2写入控制台。

享受!

我相信你正在寻找类似ReactiveUI的MessageBus类的东西。此类使用 Rx 来实现发布/订阅模型,基本上只需使用类型 => IObservables 的字典。