【问题标题】:What is the difference between using user.Email vs await _userManager.GetEmailAsync(user)?使用 user.Email 与 await _userManager.GetEmailAsync(user) 有什么区别?
【发布时间】:2022-01-27 00:05:02
【问题描述】:

使用user.Emailawait _userManager.GetEmailAsync(user) 有什么区别?

我的意思是,一旦我有了用户实例本身_userManagerGetEmailAsync() 方法将这个用户实例作为参数有什么用?我可以通过其属性访问用户的电子邮件。

我检查了源代码,我知道有一个使用 IUserEmailStore 的抽象层,但它的默认实现只是返回 Email 属性...

我也明白,IUserEmailStore 可能存在其他实现,但这种情况下会出现问题:user.Email 属性和_userManager.GetEmailAsync(user) 是否相互一致,或者不是?

如果不是,那是个问题,如果是,那么我们回到原来的问题:使用_userManager.GetEmailAsync(user)的用例是什么?

(同样的问题出现在 UserName、PhoneNumber 等属性上)

【问题讨论】:

标签: asp.net-core


【解决方案1】:

使用user.Emailawait UserManager.GetEmailAsync(user) 有什么区别?

  • user.Email 仅在您的 TUser 首先实际上具有 Email 属性时才有效。

    • 有趣的事实:ASP.NET-Core-Identity 实际上并不需要您用于 TUser 的任何 class 具有 String Email 属性。
      • 即您所假设的(用户有电子邮件地址)实际上并不能保证,ASP.NET-Core-Identity 也没有要求
    • ASP.NET-Core-Identity 对TUser 的唯一约束是TUser : class,因此如果你足够勇敢,你甚至可以使用StringIDictionary 作为TUser
      • 虽然 ASP.NET-Core-Identity 确实 具有仅在 class Microsoft.AspNetCore.Identity.IdentityUser<TKey> 上定义的 String Email { get; } 属性,但您根本没有义务使用此类:它只是一个预先编写的实现涵盖了最常见的用例,并且(可能)通过让他们将其子类化来节省大多数人的时间。
  • 但是还有其他场景需要考虑:

    • ...例如域模型设计,其中用户每个用户都有多个电子邮件地址,在这种情况下,只有一个标量String Email { get; } 属性根本行不通...虽然GetEmailAsync 也不会,但这是您错过的 ASP.NET-Core-Identity 设计的另一部分:您可以实现 IUserStore<TUser>实现 IUserEmailStore<TUser>,所以不会有要么一个Email属性也不一个GetEmailAsync方法。 (只要确保你没有继承class UserStoreBase)而是从头开始构建你的商店实现。
      • 在这个假设的情况下,没有类型实现 IUserEmailStore<TUser>,那么您的代码库中将不会有任何方法anywhere 必须抛出 NotImplementedExceptionNotSupportedException。这是一件好事:设计领域模型时的一个常见口号是“使无效的事情变得不可能”(这是我对原始格言“make invalid state unrepresentable”的破坏)。
  • 另一种情况是一些(非典型的,我承认)系统,其中用户确实有一个电子邮件地址,但它不是由内存中的 User 对象存储或表示的,在这种情况下您将必须使用GetEmailAsync 的自定义实现每次获取用户的电子邮件地址。

    • 我想这可能在使用具有极细粒度安全性的后端用户存储(例如某些偏执的 Active Directory 设置,其中当前Thread 的 NT 安全令牌用于证明从目录中请求电子邮件地址的许可......但这个想法只是猜测,我希望没有人真正支持这一点,至少在手头没有好的血压药物的情况下不会)。

结论:并非每个系统都有用户电子邮件地址,ASP.NET Core Identity 不需要他们公开它们 - 而且(诚然非常复杂) ASP.NET Core Identity 的设计反映了这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2021-09-27
    • 2019-05-06
    • 2021-08-25
    • 2017-12-30
    • 1970-01-01
    • 2012-06-15
    相关资源
    最近更新 更多