C# 当可以从用户对象中提取所需的属性时,像GetPhoneNumberAsync(IdentityUser user)这样的UserManager方法的用途是什么?

C# 当可以从用户对象中提取所需的属性时,像GetPhoneNumberAsync(IdentityUser user)这样的UserManager方法的用途是什么?,c#,.net,asp.net-core,asp.net-core-identity,asp.net-core-3.1,C#,.net,Asp.net Core,Asp.net Core Identity,Asp.net Core 3.1,我试图理解ASP.Net核心标识UI视图背后的一些逻辑 例如,Account\Manage\Index.cshtml.cs包含以下代码: private async Task LoadAsync(IdentityUser user) { var userName = await _userManager.GetUserNameAsync(user); var phoneNumber = await _userManager.GetPhoneNumb

我试图理解ASP.Net核心标识UI视图背后的一些逻辑

例如,Account\Manage\Index.cshtml.cs包含以下代码:

    private async Task LoadAsync(IdentityUser user)
    {
        var userName = await _userManager.GetUserNameAsync(user);
        var phoneNumber = await _userManager.GetPhoneNumberAsync(user);

        Username = userName;

        Input = new InputModel
        {
            PhoneNumber = phoneNumber
        };
    }

当我们可以直接从用户对象中提取PhoneNumber属性时,为什么要调用_userManager.GetPhoneNumberSync(用户)?

默认标识设置由实体框架映射到数据库的实体组成,这是用户管理器不关心的实现细节。用户管理器实际上是以这样一种方式实现的,即它主要充当提供密码验证、哈希等功能的各种单独组件的接口

其中一个组件是负责以某种方式实际持久化标识对象的

默认实现是Microsoft.AspNetCore.Identity.EntityFrameworkCore中的。请注意,名称空间包括
EntityFrameworkCore
,因此这是唯一一件实际特定于如何持久化用户对象的事情:使用EF Core

常规
IUserStore
仅负责实际存储和存储用户对象。但是,商店实现可以通过各种功能标志接口启用其他功能,如电话号码支持。例如 , , 或然后,用户管理器上的所有高级方法都将通过这些方法来确定(a)对该功能的支持,以及(b)如何获得这些值

因此,如果您只将用户视为ORM持久化的实体,那么用户管理器的这种设计似乎很复杂,但它实际上允许在用户管理器后面交换整个体系结构,而不影响前面的体系结构。这就是为什么默认标识UI使用这些方法,而不必依赖于用户是实体的实现细节,而是通过用户管理器来检索所需的值


这对你的申请有关系吗?可能不会。如果您决定将默认用户存储区与
IdentityUser
一起使用,则可以直接访问属性。应用程序不太可能在以后完全改变这一切,您可能还需要做其他更改。因此,对于您的应用程序代码,您可以直接访问实体的属性。

用户管理器所知的关于“用户”类型的唯一信息是
class
。。。它没有任何有用的属性(
class UserManager:IDisposable,其中TUser:class
)。。。那么你到底建议如何处理呢?