我试图将Observable项传递给存储库层。
我有界面
public interface Repository{
IObservable<INotification<bool>> Save(IObservable<T> objects);
}
我在测试时遇到了麻烦,并且没有找到任何人做这样的事情的例子。
这个糟糕的设计Rx明智吗?我想保存一个结果流,让存储库根据自己的语义缓冲它们。例如,存储库的实现控制着Buffer()。
这样做的部分动机是允许save方法在关闭对象流时缓冲/刷新最后一项。它可能会更频繁地这样做,但从更高层次我不在乎。
编辑:
我对测试感到非常愚蠢,显然我正在模拟对特定的observable实例的特定调用,如果我使用重放,甚至是,它实际上是一个对象的新实例,导致我的mock返回null
我仍然对这种模式感到好奇。
答案 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;
这有效地为您提供了您最初想要的完整签名,但您可以完全控制查询的执行,这样您就可以知道保存的内容和时间。