2ух разных репозиториев:
public Task UserService()
{
await _userRepo.ChangePasswordAsync(...); // меняет пароль юзера
await _tokenRepo.InvalidateAllAsync(...); // инвалидирует рефреш токены юзера
}
Есть какие то best-practices как это правильно делать, что б в сервисе не приходилось руками прокидывать экземпляры транзакции в методы репозитория?
ЧатГпт посоветовал UnitOfWork использовать. Сам с этим паттерном еще не знаком
а что не так с этим кодом? и что вы имеете ввиду под "уками прокидывать экземпляры транзакции "?
чтобы эти 2 метода репозитория выполнились атомарно, нужно им передавать один и тот же экземпляр IDbConnection (использую Dapper)
по хорошему вы недолжны передавать ничего ибо вы тяните 2 репо с DI, вам достаточно будет обернуть это в транзакцию
в TransactionScope и внутри вызывать методы репозитория имеете ввиду?
спасибо, попробую такой вариант.
Реализуй UnitOfWork и используй
из того что чатГпт предложил. public class UnitOfWork : IUnitOfWork { private readonly IDbConnection _connection; private IDbTransaction _transaction; public UnitOfWork(IDbConnection connection) { _connection = connection; _transaction = _connection.BeginTransaction(); } public IRepository1 Repository1 => new Repository1(_transaction); public IRepository2 Repository2 => new Repository2(_transaction); public void Commit() { _transaction.Commit(); } public void Rollback() { _transaction.Rollback(); } public void Dispose() { _transaction.Dispose(); _connection.Dispose(); } }
А зачем руками создавать репы внутри этого юнит оф ворка?
это чатГпт сгенерил, у меня в DI все будет
Обсуждают сегодня