В моем приложении я использую шаблон репозитория и хочу иметь возможность выполнять некоторые методы из репозитория (или нескольких репозиториев) в сеансе с транзакцией.
Это должно быть необязательно, поэтому иногда я хочу добавить пользователя без использования транзакции, но где-то еще я хочу выполнить один и тот же метод в сеансе и транзакции.
Я не хочу создавать перегрузку для каждого метода хранилища с необязательным параметром 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.
Есть ли способ дополнительно выполнять команды в коллекциях Монго без явной передачи им экземпляра сеанса?