如何让所有用户异步,与AspNetCore.身份和MongoDb?



这个问题是关于如何从AspNetCore Identity中检索所有用户的异步方法:

ASP。. NET Identity 2 UserManager get all users async

非同步方法很简单:

[HttpGet]
public ActionResult<IEnumerable<UserDto>> GetAsync()
{
var users = userManager.Users
.ToList()
.Select(user => user.AsDto());
return Ok(users);
}

显而易见的解决方案是:

[HttpGet]
public async Task<ActionResult<IEnumerable<UserDto>>> GetAsync()
{
var users = await userManager.Users
.ToListAsync()
.Select(user => user.AsDto());
return Ok(users);
}

但是这不起作用,因为userManager。Users是一个IQueryable<>,它没有定义。tolistasync()。

以上问题的建议答案是:

public async Task<List<User>> GetUsersAsync()
{
using (var context = new YourContext())
{
return await UserManager.Users.ToListAsync();
}
}

但这是绑定到实体框架,如果你使用AspNetCore.Identity。MongoDbCore,您将没有任何dbcontexts,并且上面的代码根本不起作用。

对答案的一个评论指出,. tolistasync()扩展方法是在System.Data.Entity中定义的-但如果你使用MongoDb,你就不会包括它。

如何从UserManager<>访问所有用户?在异步方法中?

基本上,AspNetCore.Identity.MongoDbCore只是围绕AspNetCore.Identity核心概念的实现。事情与Sql实现有一点不同,因为它们没有使用工作单元的概念(我知道,SaveChange实现会在事务中包装操作,但对于每个方法调用,查询执行立即得到这个非常类似于mongo)。

那么,如果我们需要进一步扩展这些基本任务,为什么不像过去那样在默认的MongoDbCore实现之上编写我们自己的实现呢?

// Starting with UserStore
public class ApplicationUserStore : MongoUserStore<How many generic would depend on use cases>, IApplicationUserStore
{
protected IMongoCollection<TUser> ApplicationUsersCollection;
public ApplicationUserStore(ApplicationDbContext context, IdentityErrorDescriber describer = null) : base(context, describer)
{
ApplicationUsersCollection = Context.GetCollection<TUser>();
}
public async Task<ICollection<ApplicationUser>> GetAllUserAsync() => // We have access to UsersCollection, implement as normal mongodb operation;
}
// Then, UserManager
public class ApplicationUserManager : UserManager<How many generic would depend on use cases>
{
private readonly IApplicationUserStore _applicationUserStore;
// Constructtor that could resolve our ApplicationUserStore.
public ApplicationUserManager(IApplicationUserStore applicationUserStore,...)
{
_applicationUserStore = applicationUserStore;
}
public async Task<ICollection<ApplicationUser>> GetAllUserAsync() => _applicationUserStore.GetAllUserAsync();
// Registering things
services.AddScoped<IApplicationUserStore, ApplicationUserStore>();
services.AddScoped<ApplicationUserManager>();
}

这只是描述的想法,实现应该是不同的。

相关内容

最新更新