Должен ли класс реализовывать как IAsyncDisposable, так и IDisposable? - PullRequest
2 голосов
/ 29 мая 2020

Например, у меня есть этот класс:

public class UnitOfWork : IUnitOfWork
{
    private readonly ApplicationDbContext _context;

    public IProductRepository Products { get; private set; }
    public ICategoryRepository Categories { get; private set; }
    public IPhotoRepository Photos { get; private set; }

    public UnitOfWork(ApplicationDbContext context, IProductRepository productRepository,
        ICategoryRepository categoryRepository, IPhotoRepository photoRepository)
    {
        _context = context;
        Products = productRepository;
        Categories = categoryRepository;
        Photos = photoRepository;
    }

    public int Complete()
    {
        return _context.SaveChanges();
    }

    public Task<int> CompleteAsync()
    {
        return _context.SaveChangesAsync();
    }

    public void Dispose()
    {
        _context.Dispose();
    }

    public async ValueTask DisposeAsync()
    {
        await _context.DisposeAsync();
    }
}

С таким интерфейсом:

public interface IUnitOfWork : IDisposable, IAsyncDisposable
{
    IProductRepository Products { get; }
    ICategoryRepository Categories { get; }
    IPhotoRepository Photos { get; }
    int Complete();
    Task<int> CompleteAsync();
}

Правильно ли иметь методы Asyn c и Syn c? Также какой метод будет вызываться при удалении, если я использую DI, например, в ядре asp net.

1 Ответ

2 голосов
/ 29 мая 2020

Независимо от вашей озабоченности AspNetCore; да, вполне нормально иметь методы Syn c и Asyn c, реализованные в одном классе.

Но наличие цепочек интерфейсов (один интерфейс требует реализации другого) считается небезупречным - код.

см. это

...