如何在可观察的链中重复使用对象实例



在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;
        });
    }

相关内容

  • 没有找到相关文章

最新更新