我正在尝试将一个Observable项目传递到存储库层。
我有接口
public interface Repository{
IObservable<INotification<bool>> Save(IObservable<T> objects);
}
我在测试中遇到了麻烦,并且没有发现任何人们这样做的例子。
这种糟糕的设计Rx明智吗?我想保存一个结果流,让存储库根据自己的语义对它们进行缓冲。例如,存储库的实现由Buffer()控制。
这样做的部分动机是允许save方法在对象流关闭时缓冲/刷新最后一项。它可能会更频繁地这样做,但从更高的级别来看,我不在乎。
编辑:我对测试感到很愚蠢,显然我是在模拟对一个可观察对象的特定实例的特定调用,如果我使用replay,甚至这样做,实际上是一个对象的新实例,导致我的mock返回null。
我仍然对这种模式很好奇。
我认为值得考虑你的接口可能的语义。
public interface Repository
{
IObservable<INotification<bool>> Save<T>(IObservable<T> objects);
}
可观测的objects
可能是热的,也可能是冷的,它可能包含连续值之间的延迟,它可能是无穷大的。你可能不会想到你的消费者会用"不利的"可观察对象来称呼它,但他们可能会这么做。
结果也是一个可观察对象。那么,下面的代码是什么意思呢?
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;
这有效地为您提供了您最初想要的完整签名,但您完全控制查询的执行,因此您知道保存什么以及何时保存。