通过主题 - 首选方法装饰IObservable?

时间:2014-12-05 04:32:41

标签: c# system.reactive

我一直在创建一系列IObservable扩展方法,这些方法是特定于域的,但基本上都具有通过另一个类(实现ISubject)传递现有序列并提供净输出的形式。

在我做了其中的一些之后,我发现有一种模式,并设法提炼出我正在做的事情,直到下面:

    /// <summary>
    /// Returns an observable sequence that is the output of subscribing the existing sequence to
    /// a subject (the result of <paramref name="subjectFactory"/>) and consuming the result
    /// </summary>
    /// <returns>Kinda suspicious that this doesn't exist out of the box, now I've pared
    /// it right down to what it basically is</returns>
    public static IObservable<T> Decorate<T>(this IObservable<T> input, Func<ISubject<T>> subjectFactory)
    {
        return Observable.Create<T>(observer =>
            {
                var processor = subjectFactory();
                var subscriptions = new[]
                    {
                        processor.Subscribe(observer),
                        input.Subscribe(processor),
                    };
                return new CompositeDisposable(subscriptions);
            });
    }

像这样把所有其他扩展方法减少到单行。但这是所以泛型,我很怀疑这已经不存在了。但我找不到一个。

所以问题是:这个功能是否存在于任何地方的基本RX库中?我正在寻找一个ISubject<T>,处理所有订阅仪式并吐出结果(如上所述)

-

编辑:是的,有关避免主题实施和依靠创建的评论很好。在这种情况下,由于以下几个原因,我不想将操作公开为方法:

  • 他们在Create lambdas
  • 中制作了一些相当难以理解的代码
  • 有一个引擎需要将它们全部拼接成一个管道,这样它就可以多态化(即不知道操作是什么)。但回想起来,如果它收到一组运算符作为委托(即IEnumerable<Func<IObservable<T>,IObservable<T>>>并且以这种方式有效地创建了订阅者链 - 即依次通过每个func输入可观察的输入以获得输出,它可以实现相同的事情。

操作本身依靠内部Subject<T>来完成所有繁重的工作,所以不像他们从头开始实施ISubject<T> ,我知道这是通往地狱的道路......

1 个答案:

答案 0 :(得分:1)

是的,我认为您的功能只是Multicast的变体:

public static IObservable<T> Decorate<T>(this IObservable<T> input, Func<ISubject<T>> subjectFactory)
{
    return input.Multicast(subjectFactory, t => t);
}

但说实话,我同意戴夫的评论。您可能不需要多播功能。我发现的常见模式是特定于域的类不应该是ISubject实现,而应该只有IObservable作为输入的方法,并返回一个新的IObservable作为输出(与他们的领域逻辑应用)。类似的东西:

IObservable<Bar> DoLogic(IObservable<Foo> foos)
{
    return foos.Select(foo => ...);
}