我可以使用反应式扩展进行独立订阅/发布吗?
本文关键字:布吗 独立 可以使 反应式 扩展 我可以 | 更新日期: 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
。
然后,您可以只编写两个Subscribe
和Publish
方法来处理内部字典。
其实应该很简单。
与其说它很简单,我想我会试一试。
这是我的 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 的字典。