реализация асинхронного интерфейса для списка данных в памяти - PullRequest
0 голосов
/ 26 октября 2018

В настоящее время я изменяю синхронную реализацию на асинхронную реализацию. Я обновил и определил следующий интерфейс:

public interface IMGP1DFC
{
    // get all
    Task<IEnumerable<MGP1DFC>> GetAllAsync();

    // get single
    Task<MGP1DFC> GetSingleAsync(int id);

    // add
    void Add(MGP1DFC mgp1dfc);

    // update
    void Update(MGP1DFC mgp1dfc);

    // delete
    void Delete(MGP1DFC mgp1dfc);

    // save
    Task SaveAsync();
}

У меня есть служба, реализованная и определенная с использованием этого интерфейса, который подключается к базе данных следующим образом:

public class MGP1DFCData : IMGP1DFC
{
    private ApplicationDbContext _applicationDbContext;
    //
    public MGP1DFCData(ApplicationDbContext applicationDbContext) {
        _applicationDbContext = applicationDbContext;
    }
    public void Add(MGP1DFC mgp1dfc)
    {
        _applicationDbContext.Add(mgp1dfc);
    }

    public void Delete(MGP1DFC mgp1dfc)
    {
        _applicationDbContext.Remove(mgp1dfc);
    }

    public async Task<IEnumerable<MGP1DFC>> GetAllAsync()
    {
        return await _applicationDbContext.MGP1DFC.OrderBy(x => x.ReceivedByDateTime).ToListAsync();
    }

    public async Task<MGP1DFC> GetSingleAsync(int id)
    {
        return await _applicationDbContext.MGP1DFC.FirstOrDefaultAsync(x => x.Id == id);
    }

    public async Task SaveAsync()
    {
        await _applicationDbContext.SaveChangesAsync();
    }

    public void Update(MGP1DFC mgp1dfc)
    {
        _applicationDbContext.Update(mgp1dfc);
    }
}

Нет проблем.

Однако ранее здесь была служба в памяти:

public class MGP1DFCInMemory : IMGP1DFC
{

    List<MGP1DFC> MGP1DFCs;

    public MGP1DFCInMemory()
    {
        MGP1DFCs = new List<MGP1DFC> {
            new MGP1DFC { Id = 1, Name = "DS", Nino = "DS123123D", SentByName = "Bobbleton", SentByEmail = "Bobbleton@ds.com.uk.net", ReceivedByDateTime = DateTime.Now},
            new MGP1DFC { Id = 2, Name = "Kenneth", Nino = "FG123123D", SentByName = "Pattie", SentByEmail = "pattie@ds.com.uk.net", ReceivedByDateTime = DateTime.Now.AddHours(6)},
            new MGP1DFC { Id = 3, Name = "Bob", Nino = "DS123123D", SentByName = "The Chieftain", SentByEmail = "cheiftain@ds.com.uk.net", ReceivedByDateTime = DateTime.Now.AddMinutes(904)}
        };
    }

    public void Add(MGP1DFC MGP1DFC)
    {
        MGP1DFC.Id = MGP1DFCs.Max(index => index.Id) + 1;
        MGP1DFCs.Add(MGP1DFC);
    }

    public void Delete(MGP1DFC MGP1DFC)
    {
        MGP1DFCs.Remove(MGP1DFC);
    }

    public IEnumerable<MGP1DFC> GetAll()
    {
        return MGP1DFCs.OrderBy(x => x.ReceivedByDateTime);
    }

    public MGP1DFC GetSingle(int id)
    {
        return MGP1DFCs.FirstOrDefault(x => x.Id == id);
    }

    public MGP1DFC Update(MGP1DFC category)
    {
        MGP1DFC formToUpdate = MGP1DFCs.FirstOrDefault(i => i.Id == category.Id);
        formToUpdate.CompletedByDateTime = DateTime.Now;
        formToUpdate.CompletedByEmail = "ds@ds.com";
        formToUpdate.CompletedBy = "DS";
        return formToUpdate;
    }
}

Можно ли реализовать асинхронную службу в памяти?

например,

public async Task<IEnumerable<MGP1DFC>> GetAllAsync()
    {
        return await MGP1DFCs.OrderBy(x => x.ReceivedByDateTime).ToListAsync();
    }

Или это полная трата времени, пытаться!?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

В «службе памяти» нет ничего асинхронного, если предположить, что она, как следует из названия, выполняет только связанную с ЦП работу с данными в памяти.

Предоставление асинхронных оболочек для методов, которые на самом деле являются синхронными, обычно считается запахом кода. Пожалуйста, обратитесь к @ блогу Стивена Клири для получения дополнительной информации об этом.

Редактировать: Если «служба в памяти» - это всего лишь своего рода заглушка для действительно асинхронной службы, которая взаимодействует с базой данных, и вы просто хотите, чтобы она реализовала тот же интерфейс, что и «настоящая» служба , вы можете использовать метод Task.FromResult для возврата выполненных задач, как предложено @FCin. Если «служба в памяти» - это что-то другое, для него не имеет смысла реализовывать «асинхронный» интерфейс.

0 голосов
/ 26 октября 2018

Если вам нужно, чтобы этот класс просто реализовал интерфейс, вы можете написать синхронную реализацию этого интерфейса, используя Task.FromResult. Это создает уже законченную задачу, и все операции выполняются синхронно .

public Task<IEnumerable<MGP1DFC>> GetAllAsync()
{
    return Task.FromResult(MGP1DFCs);
}

public Task<MGP1DFC> GetSingleAsync(int id)
{
    return Task.FromResult(MGP1DFCs.FirstOrDefault(x => x.Id == id));
}

public async Task SaveAsync()
{
    // Not much to do here...
    return Task.CompletedTask;
} 
...