Как мне повторно использовать экземпляр объекта в наблюдаемой цепочке? - PullRequest
0 голосов
/ 25 апреля 2018

В rx, как вы справляетесь с необходимостью повторного использования экземпляра объекта за один шаг на следующем шаге? Например, мне нужно получить контекст в ORM, чтобы затем действовать. Async / Await находится в синтаксисе ниже:

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

Однако я не хочу создавать новый контекст каждый раз, когда удаляю элемент. Я хочу создать контекст, а затем повторно использовать его в выборе. Как мне это сделать?

Да, в этом примере было бы лучше также буферизовать и отправить идентификаторы вместе, но это был только пример для моего вопроса. Я надеюсь, что эта часть не отвлекает.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Более идиоматический способ сделать это так:

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 о запросах.Любые изменения должны быть сделаны в методе. Subscribe.

Чего вы пытаетесь достичь?

0 голосов
/ 25 апреля 2018

Я думаю, что получил его, и ответ остается «SelectMany». Наверное, я все еще привыкаю к ​​этим операторам.

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