Выполнять команды в сеансе, не передавая их каждому - PullRequest
1 голос
/ 28 мая 2019

В моем приложении я использую шаблон репозитория и хочу иметь возможность выполнять некоторые методы из репозитория (или нескольких репозиториев) в сеансе с транзакцией. Это должно быть необязательно, поэтому иногда я хочу добавить пользователя без использования транзакции, но где-то еще я хочу выполнить один и тот же метод в сеансе и транзакции. Я не хочу создавать перегрузку для каждого метода хранилища с необязательным параметром IClientSessionHandle, что звучит для меня очень некрасиво.

Я попытался реализовать шаблон Unit of Work, как я использовал в Entity Framework. Код, который у меня есть, но не работает, выглядит следующим образом:

using (var uow = _uowProvider.Create())
{
     repository.Add(someEntity);   
     repository.Add(otherEntity);
     uow.Commit(); //just calls CommitTransaction on wrapped session
}

«uow» в этом примере просто оборачивает IClientSessionHandle, и я надеялся, что если я создам коллекции из этого сеанса, они будут включены в него и его транзакцию, но это не так.

Внутри IUnitOfWorkProvider я создаю экземпляры коллекций (упрощенно) следующим образом:

_unitOfWorkProvider.Current == null
                       ? collection
                       : _unitOfWorkProvider.Current.Session.Client.GetDatabase(collection.Database.DatabaseNamespace.DatabaseName)
                           .GetCollection<T>(collection.CollectionNamespace.CollectionName);

В результате мои команды (например, InsertOneAsync и т. Д.) Не выполняются в сеансе, поскольку я не передаю им объект сеанса. Если я передаю нулевой сеанс вызова (потому что сеанс / транзакция является необязательным), он выдает NRE.

Есть ли способ дополнительно выполнять команды в коллекциях Монго без явной передачи им экземпляра сеанса?

1 Ответ

1 голос
/ 30 мая 2019

посмотрите на исходный код MongoDB.Entities , чтобы увидеть, как он решает эту проблему. конечным результатом является код транзакции, который выглядит следующим образом:

    using (var TN = new Transaction())
    {
         var author1 = new Author { Name = "one" };
         var author2 = new Author { Name = "two" };

         TN.Save(author1);
         TN.Save(author2);

         TN.Commit();
         }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...