在rx中,您如何处理下一步的一个步骤重复使用对象实例的需求?例如,我需要在ORM中获得一个上下文才能采取行动。异步/等待在下面的语法中:
public async Task<IList<string>> Delete(IList<string> ids)
{
var context = await _contextFactory.CreateContext();
context.Set<T>().RemoveRange(
context.Set<T>().Where(item => ids.Contains(item.Id)));
return ids;
}
可观察的版本是
public IObservable<string> DeleteObservable(IList<string> ids)
{
return ids.ToObservable()
.Select(i =>
{
var context = await _contextFactory.CreateContext();
context.Set<T>().RemoveRange(
context.Set<T>().Where(item => item.Id == id));
return id;
});
}
但是,我不想每次删除项目时都创建一个新的上下文。我想创建一个上下文,然后在选择中重复使用。我应该怎么做?
是的,在此示例中,最好也可以缓冲并一起提交ID,但这只是我问题的一个例子。我希望那部分不会分散注意力。
这样做的更愚蠢的方式就是这样:
public IObservable<string> DeleteObservable(IList<string> ids)
{
return Observable.Using(
async () => await _contextFactory.CreateContext(),
context =>
ids.ToObservable().Select(i =>
{
context.Set<T>().RemoveRange(context.Set<T>().Where(item => item.Id == i));
return i;
}));
}
Observable.Using
方法创建了一个可支配资源,该资源在可观察到的关闭时被处置。
唯一的问题是语句context.Set<T>().RemoveRange(context.Set<T>().Where(item => item.Id == i));
不应该在这样的观察中。RX是关于查询的。任何更改都应在a中进行。Subscribe
方法。
您要实现什么?
我想我明白了,答案不断成为'selectany'。我想我仍然适应这些操作员。
public IObservable<string> DeleteObservable(IList<string> ids)
{
return Observable
.Return(_contextFactory)
.SelectMany(factory => factory.CreateContext())
.Zip(ids.ToObservable(), (dbContext, entityId) =>
{
dbContext.Set<T>().RemoveRange(
dbContext.Set<T>().Where(item => item.Id == entityId));
return entityId;
});
}