在方法中传入IObservable <t>

时间:2015-09-01 08:34:19

标签: c# system.reactive

我试图将Observable项传递给存储库层。

我有界面

public interface Repository{
    IObservable<INotification<bool>> Save(IObservable<T> objects);
}

我在测试时遇到了麻烦,并且没有找到任何人做这样的事情的例子。

这个糟糕的设计Rx明智吗?我想保存一个结果流,让存储库根据自己的语义缓冲它们。例如,存储库的实现控制着Buffer()。

这样做的部分动机是允许save方法在关闭对象流时缓冲/刷新最后一项。它可能会更频繁地这样做,但从更高层次我不在乎。

编辑:

我对测试感到非常愚蠢,显然我正在模拟对特定的observable实例的特定调用,如果我使用重放,甚至是,它实际上是一个对象的新实例,导致我的mock返回null

我仍然对这种模式感到好奇。

1 个答案:

答案 0 :(得分:1)

我认为值得考虑你的界面可能的语义。

public interface Repository
{
    IObservable<INotification<bool>> Save<T>(IObservable<T> objects);
}

可观察的objects可能是热的还是冷的,它可能包含连续值之间的延迟,并且它可能是无限的。您可能不会设想您的消费者称之为&#34;不利的&#34;可观察的,但他们可能。

此外,结果是可观察到的。那么,以下代码应该是什么意思?

var results = repository.Save(myObservableObjects);

这可能会触发保存,也可能无法执行任何操作!

您可能必须执行以下操作才能实际触发保存:

 results.Subscribe(...);

如果两个或多个观察者订阅了可观察的结果,那么结果会是什么?它会仅仅返回现有结果吗?它会从源可观察对象中触发对象的新保存吗?

这种存储库的语义太多样了。

在我看来,这是您需要的界面:

public interface Repository
{
    Task<INotification<bool>> Save<T>(T item);
}

然后你可以这样做:

IObservable<INotification<bool>> results =
    from item in items
    from result in Observable.FromAsync(() => repository.Save(item))
    select result;

这有效地为您提供了您最初想要的完整签名,但您可以完全控制查询的执行,这样您就可以知道保存的内容和时间。