C# 通过DbContext与UserManager进行访问

C# 通过DbContext与UserManager进行访问,c#,asp.net-core,entity-framework-core,asp.net-core-identity,C#,Asp.net Core,Entity Framework Core,Asp.net Core Identity,使用UserManager或DbContext是否有缺点或优点 如果我使用这个: public class UserManager<TUser> : IDisposable where TUser : class public virtual Task<TUser> FindByIdAsync(string userId); 现在,您可以从数据库中查询用户。如果您决定将身份验证委托给授权服务器,该怎么办?我以前见过这种情况:人们决定创建一个Web API来处理身份验证

使用UserManager或DbContext是否有缺点或优点

如果我使用这个:

public class UserManager<TUser> : IDisposable where TUser : class

public virtual Task<TUser> FindByIdAsync(string userId);

现在,您可以从数据库中查询用户。如果您决定将身份验证委托给授权服务器,该怎么办?我以前见过这种情况:人们决定创建一个Web API来处理身份验证/授权细节。如果直接使用
DbContext
,则必须在使用它的任何地方进行更改

另一方面,通过使用
UserManager
,您只需将
UserManager
的实现更改为使用
HttpClient
,以使用Web API来查询用户、角色和创建用户身份所需的其他内容


UserManager
通过
IUserStore
和一些其他接口封装了实现细节。我会避免直接查询任何标识表,尽管这是一种尝试。

如果直接使用实体框架,主要缺点是如果将存储更改为其他内容,则必须更改所有引用

ASP.NET Core Identity允许您通过两个步骤创建自定义存储:

  • 创建实现所需接口的类

    public class MyStore : IUserStore<ApplicationUser>, ... // many more
    { }
    
    公共类MyStore:IUserStore,…//更多
    { }
    
  • 将实体框架存储替换为您的实体框架存储:

    // default
    services.AddIdentity(...).AddEntityFrameworkStores();
    // yours
    services.AddIdentity(...).AddUserStore<MyStore>();
    
    //默认值
    services.AddIdentity(…).AddEntityFrameworkStores();
    //你的
    services.AddIdentity(…).AddUserStore();
    
  • 如果您曾经因为业务需求或Entity Framework Core中不可用的数据存储方法(甚至愿意从项目中删除EF Core)而需要创建自定义存储,那么最好使用
    UserManager
    方法

    // default
    services.AddIdentity(...).AddEntityFrameworkStores();
    // yours
    services.AddIdentity(...).AddUserStore<MyStore>();