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

What is the purpose of UserManager methods like GetPhoneNumberAsync(IdentityUser user), when the desired properties can be pulled from user object?

我正在尝试理解 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
        };
    }

当我们可以直接从用户对象中提取电话号码 属性 时,为什么要调用 _userManager.GetPhoneNumberAsync(user)?

默认身份设置由 Entity Framework 映射到数据库的实体组成这一事实是用户管理器不关心的实现细节。用户管理器的实际实现方式主要是作为 facade 提供密码验证、散列等功能的各个组件的

其中一个组件是 IUserStore<>,它负责以某种方式实际保留身份对象。

默认实现是 Microsoft.AspNetCore.Identity.EntityFrameworkCore 中的 UserStore<>。请注意,命名空间包含 EntityFrameworkCore,因此这是唯一实际特定于用户对象持久化方式的内容:使用 EF Core。

一般IUserStore<>只负责实际存储用户对象。但是,商店实现可以通过各种功能标志接口启用其他功能,例如 phone 数字支持。例如IUserClaimStore<>, IUserEmailStore<>, IUserPhoneNumberStore<>, 或 IUserTwoFactorStore<>。然后,用户管理器上的所有高级方法将通过这些来确定 (a) 对该功能的支持,以及 (b) 如何获取这些值。

因此,如果您仅将用户视为由 ORM 持久化的实体,那么用户管理器的这种设计似乎很复杂,但它实际上允许在不影响前端的情况下换出用户管理器背后的整个体系结构。这就是为什么默认身份 UI 使用这些方法,不必依赖用户是实体的实现细节,而是通过用户管理器检索它需要的值。

这对您的申请重要吗?可能不会。如果您决定使用带有 IdentityUser 的默认用户存储,那么您可以直接访问这些属性。应用程序不太可能稍后完全切换所有内容,您可能还必须进行其他更改。因此对于您的应用程序代码,您可以直接访问实体的属性。