我正在使用各种资源来尝试使用MS Access为AngularJS应用程序实现身份系统。 我创建了实现我需要的Identity接口的类,并且我一直处于创建帐户控制器的阶段(这将是用于注册,登录等的API)。
班级UserStore
实施IUserStore
并使用CreateAsync
方法:
public Task CreateAsync(TUser user)
{
if (user == null)
{
throw new ArgumentNullException("user");
}
var result = userTable.Insert(user);
return Task.FromResult(result);
}
AccountController
实施ApiController
并使用Register
方法:
[AllowAnonymous]
[Route("register")]
public async Task<IHttpActionResult> Register(IdentityUser user)
{
var result = await _userStore.CreateAsync(user);
if (result == 0)
{
return InternalServerError();
}
return Ok();
}
userTable.Insert(user)
返回int
,表示数据库表中受影响的行数。第var result = await _userStore.CreateAsync(user);
行会引发错误,说它实际返回void
,因此无法将void
分配给var
(或其他任何内容)。
我很难理解如何编写Register
方法和CreateAsync
方法,以便它们能够协同工作。
async
的事情,只是让CreateAsync
和Register
按原样返回int值,但我不能这样做,因为{ {1}}实现了'IUserStore'。
答案 0 :(得分:1)
问题是返回类型无法从CreateAsync
传递,因为它只是Task
返回。它需要Task<int>
但是你不能这样做,因为它实现了IUserStore
接口。为什么你需要结果,我假设你没有?
请改为尝试:
[AllowAnonymous]
[Route("register")]
public async Task<IHttpActionResult> Register(IdentityUser user)
{
await _userStore.CreateAsync(user);
return Ok();
}
此外,如果可能,请考虑拨打userTable.Insert(user)
async
电话。
我建议不要放弃async/await
。特别是对于像这样的网站上的I / O绑定操作,它们确实使您的应用程序可用。
如果您真的担心插入内容是否有问题,请尝试以下方法:
public async Task CreateAsync(TUser user)
{
if (user == null)
{
throw new ArgumentNullException("user");
}
var existingUser = await this.FindByIdAsync(user.Id);
if (existingUser != null)
{
await this.UpdateAsync(user);
}
else
{
userTable.Insert(user);
}
}