Как реализовать транзакции с шаблоном репозитория Generi c? - PullRequest
0 голосов
/ 07 января 2020

Я разрабатываю базовое приложение. NET, в котором я использую шаблон репозитория Generi c, и я хотел бы знать, как я могу реализовать транзакцию:

IGenericRepository

public interface IGenericRepository<T>
    {
        Task InsertAsync(T insert);
        Task<bool> RemoveAsync(object id);
        Task UpdateAsync(T entity);
        Task<T> GetByIdAsync(object id,string includeProperties="");
        Task<IQueryable<T>> GetAsync(Expression<Func<T, bool>> filter=null,
                                     int? skip=null,
                                     int? take=null,
                                     Func<IQueryable<T>,IOrderedQueryable<T>> orderBy = null,
                                     string includeProperties = "");
        Task SaveAsync();
    }

Я смотрел на эту реализацию, которая также использует UnitOfWork, но в. NET Core, у меня нет DbContextTransaction.

I я еще не использую UnitOfWork. В настоящее время мой сервис выглядит следующим образом:

public class SomeService
{
   IGenericRepository<A> arepo;
   IGenericRepository<B> brepo;
   public SomeService(IGenericRepository<A> arepo,IGenericRepository<B> brepo)
   {
        this.arepo=arepo;
        this.brepo=brepo;
   }
   public async Task DoTransaction(id)
   {
        var a=await arepo.GeyById(id)
        await brepo.RemoveAsync(a.Id);
        await brepo.SaveChangesAsync();
        await arepo.InsertAsync([something]);
        await arepo.SaveChanges();
   }  
}

Я хотел бы сделать эту транзакцию, а также избегать использования SaveChangesAsync для всех участвующих репозиториев.

Какое решение будет?

1 Ответ

1 голос
/ 07 января 2020

Что ж, я не эксперт в области сущностей, но отвечаю с точки зрения хранилища и единицы работы.

Для начала, избегайте ненужной оболочки дополнительного хранилища generi c, поскольку вы уже используете полный ОРМ. Пожалуйста, обратитесь к этому ответу.

, но в. NET Ядро У меня нет транзакции DbContextTransaction.

Важно DbContextTransaction но не ключ для реализации единицы работы в этом случае. Что важно, это DBContext. DBContext отслеживает и сбрасывает изменения. Вы звоните SaveChanges на DBContext, чтобы сообщить, что вы сделали.

Я хотел бы сделать эту транзакцию

Я уверен, что должно быть что-то доступное для замените DbContextTransaction или для представления транзакции.

Один из способов, предложенных Microsoft , заключается в следующем:

context.Database.BeginTransaction()

, где context is DbContext.

Другой способ объяснен здесь .

, также избегайте использования SaveChangesAsyn c для всех участвующих репо

Это возможно. Не кладите SaveChanges в репозитории. Поместите это в отдельный класс. Добавьте этот класс в каждый конкретный репозиторий / generi c. Наконец, просто позвоните SaveChanges один раз, когда вы закончите. Для примера кода, вы можете взглянуть на этот вопрос. Но в коде этого вопроса есть ошибка, которая исправлена ​​в ответе, который я ему дал.

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