传入 IObservable<T> in 方法



我正在尝试将一个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;

这有效地为您提供了您最初想要的完整签名,但您完全控制查询的执行,因此您知道保存什么以及何时保存。

相关内容

  • 没有找到相关文章

最新更新