我一直在创建一系列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>
,处理所有订阅仪式并吐出结果(如上所述)
-
编辑:是的,有关避免主题实施和依靠创建的评论很好。在这种情况下,由于以下几个原因,我不想将操作公开为方法:
IEnumerable<Func<IObservable<T>,IObservable<T>>>
并且以这种方式有效地创建了订阅者链 - 即依次通过每个func输入可观察的输入以获得输出,它可以实现相同的事情。 操作本身依靠内部Subject<T>
来完成所有繁重的工作,所以不像他们从头开始实施ISubject<T>
,我知道这是通往地狱的道路......
答案 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 => ...);
}