Asp.Net 用于发布实体的核心存储库和工作单元模式
Asp.Net core Repository and Unit Of Work Pattern for Posting an entity
尝试使用异步方法,就像我以前对存储库模式所做的那样 post 一个实体,但这次我想集成工作单元模式,这是我的界面:
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");
}
但是我得到了以下错误:
Can't wait for 'void'
那是因为我正在尝试调用异步 HttpPost 方法中无效的 Save() 方法,我知道这没有任何意义,但直到现在我还找不到如何针对这种特殊情况实现它。
当我尝试删除 await 时,出现以下错误:
Unable to implicitly convert type 'void' to 'bool'
关于如何实施的任何建议?
要么将接口重构为异步的,要么添加一个额外的成员
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);
}
//...
尝试使用异步方法,就像我以前对存储库模式所做的那样 post 一个实体,但这次我想集成工作单元模式,这是我的界面:
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");
}
但是我得到了以下错误:
Can't wait for 'void'
那是因为我正在尝试调用异步 HttpPost 方法中无效的 Save() 方法,我知道这没有任何意义,但直到现在我还找不到如何针对这种特殊情况实现它。 当我尝试删除 await 时,出现以下错误:
Unable to implicitly convert type 'void' to 'bool'
关于如何实施的任何建议?
要么将接口重构为异步的,要么添加一个额外的成员
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);
}
//...