Asp. Net Базовый репозиторий и шаблон единицы работы для публикации сущности - PullRequest
1 голос
/ 15 февраля 2020

Попытка использовать метод asyn c, как я делал это с шаблоном репозитория для публикации сущности, но на этот раз я хотел интегрировать шаблон единицы работы, вот мой интерфейс:

public interface IUnitOfWork : IDisposable
{
    . . .
    void Save();
}

И его реализация:

public class UnitOfWork : IUnitOfWork
{
    private readonly DataContext _db;

    public UnitOfWork(DataContext db)
    {
        _db = db;
        . . .
    }
    . . .
    public void Dispose()
    {
        _db.Dispose();
    }

    public void Save()
    {
        _db.SaveChanges();
    }
}

А вот мой метод:

    [HttpPost]
    public async Task<IActionResult> CreateItem(string userId, ItemForCreationDto itemForCreationDto)
    {
        if (userId != User.FindFirst(ClaimTypes.NameIdentifier).Value)
            return Unauthorized();

        itemForCreationDto.UserId = userId;
        var item = _mapper.Map<Item>(itemForCreationDto);

        if (item == null)
            return BadRequest("Could not find item");

        _uow.Item.Add(item);

        if (await _uow.Save())                                       <--- Error here
        {
            var itemToReturn = _mapper.Map<ItemToReturnDto>(item);
            return CreatedAtRoute("GetItem",
                new { userId, id = item.Id }, itemToReturn);
        }

        throw new Exception("Creating the item failed on save");
    }

Но я получил следующие ошибки:

Не могу дождаться для 'void'

Это потому, что я пытаюсь вызвать метод Save (), который является пустым из асинхронного c метода HttpPost, я знаю, что это не имеет смысла, но до сих пор я не мог найдите, как реализовать это для этого особого случая. Когда я попытался удалить await, я получил следующую ошибку:

Невозможно неявно преобразовать тип 'void' в 'bool'

Есть предложения о том, как это реализовать?

1 Ответ

1 голос
/ 15 февраля 2020

Либо измените рефакторинг интерфейса, чтобы он был асинхронным c, либо добавьте дополнительный элемент

public interface IUnitOfWork : IDisposable {

    //. . .

    Task<bool> SaveAsync();
}

, который может, вероятно, обернуть асинхронный API контекста в реализации, если он существует

public async Task<bool> SaveAsync() {
    int count = await _db.SaveChangesAsync();
    return count > 0;
}

с учетом желаемой функциональности

//...

if (await _uow.SaveAsync()){
    var itemToReturn = _mapper.Map<ItemToReturnDto>(item);
    return CreatedAtRoute("GetItem", new { userId, id = item.Id }, itemToReturn);
}

//...
...