我可以使用Reactive Extensions进行独立订阅/发布吗?

时间:2012-04-18 20:08:34

标签: c# system.reactive publish-subscribe

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

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

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

Observable.Publish(instanceOfMyClass);

第二行触发了使用该确切类类型订阅的所有方法。这是Reactive Extensions(v1或v2)支持的内容吗?

将SynchronizationContext指定为Subscribe调用的一部分会很有用。在那里指定是否应该使用WeakReference保持该方法也是很好的。发布方法应该能够同步完成所有操作或者给我一些我可以等待的东西。

2 个答案:

答案 0 :(得分:3)

我相信你正在寻找ReactiveUI的MessageBus class之类的东西。这个类使用Rx来实现发布/订阅模型,基本上只需要一个Type of Type =&gt; IObservables。

答案 1 :(得分:3)

这不难创造。

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

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

事实上应该很简单。


而不是简单地说它很简单,我以为我会试一试。

这是我的Rx Pub / Sub类:

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写入控制台。

享受!