1

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

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

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

Observable.Publish(instanceOfMyClass);

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

将 SynchronizationContext 指定为订阅调用的一部分会很有用。在那里指定方法是否应该使用 Wea​​kReference 也是很好的。并且 Publish 方法应该能够同步完成这一切,或者给我一些我可以等待的东西。

4

2 回答 2

3

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

于 2012-04-18T23:34:18.973 回答
3

这不难创造。

您只需要一个 internalDictionary<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仅写入控制台。

享受!

于 2012-04-19T03:34:19.653 回答