Я использую. NET Core 3.1. У меня следующая проблема: я хочу сделать транзакцию на уровне приложений. Там у меня есть интерфейс DbContext, потому что я не хочу иметь доступ к уровню инфраструктуры, где у меня есть класс DbContext. В других архитектурах мне удалось получить доступ к полю базы данных и, следовательно, к транзакции, потому что я внедрял класс DbContext. Сейчас я внедряю созданный мной интерфейс DbContext и не знаю, как добавить необходимые поля, в результате чего возможно использование поля Database из класса DbContext. Вот инфраструктурный уровень DbContext.
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, long>, IApplicationDbContext
{
private readonly ICurrentUserService _currentUserService;
private readonly IDateTime _dateTime;
public ApplicationDbContext(DbContextOptions options, ICurrentUserService currentUserService, IDateTime dateTime)
: base(options)
{
_currentUserService = currentUserService;
_dateTime = dateTime;
}
public DbSet<City> Cities { get; set; }
}
А вот интерфейс DbContext прикладного уровня.
public interface IApplicationDbContext
{
Task<int> SaveChangesAsync(CancellationToken cancellationToken);
public DbSet<City> Cities { get; set; }
}
Я хочу иметь возможность сделать что-то подобное
public class CityService
{
private readonly IApplicationDbContext _context;
public CityService(IApplicationDbContext context)
{
_context = context;
}
public Task AddAsync(City city, CancellationToken cancellationToken)
{
using var transaction = _context.Database.BeginTransaction();
try
{
await _context.AddAsync(city, cancellationToken);
await _context.SaveChangesAsync(cancellationToken);
await transaction.CommitAsync();
}
catch (Exception e)
{
await transaction.RollbackAsync();
}
}
}