namespace Dpz.Core.Auth.Service;

public sealed class UserInfoStore(IAccountService accountService) : IUserStore<VmUserInfo>
{
    public void Dispose() { }

    public async Task<string> GetUserIdAsync(VmUserInfo user, CancellationToken cancellationToken)
    {
        return await Task.Run(() => user.Id, cancellationToken);
    }

    public async Task<string?> GetUserNameAsync(
        VmUserInfo user,
        CancellationToken cancellationToken
    )
    {
        return await Task.Run(() => user.Name, cancellationToken);
    }

    public async Task SetUserNameAsync(
        VmUserInfo user,
        string? userName,
        CancellationToken cancellationToken
    )
    {
        ArgumentNullException.ThrowIfNull(userName);
        await Task.Run(() => user.Name = userName, cancellationToken);
    }

    public async Task<string?> GetNormalizedUserNameAsync(
        VmUserInfo user,
        CancellationToken cancellationToken
    )
    {
        return await Task.Run(() => user.Name, cancellationToken);
    }

    public async Task SetNormalizedUserNameAsync(
        VmUserInfo user,
        string? normalizedName,
        CancellationToken cancellationToken
    )
    {
        ArgumentNullException.ThrowIfNull(normalizedName);
        await Task.Run(() => user.Name = normalizedName, cancellationToken);
    }

    public Task<IdentityResult> CreateAsync(VmUserInfo user, CancellationToken cancellationToken)
    {
        throw new NotImplementedException();
    }

    public Task<IdentityResult> UpdateAsync(VmUserInfo user, CancellationToken cancellationToken)
    {
        throw new NotImplementedException();
    }

    public Task<IdentityResult> DeleteAsync(VmUserInfo user, CancellationToken cancellationToken)
    {
        throw new NotImplementedException();
    }

    public async Task<VmUserInfo?> FindByIdAsync(string userId, CancellationToken cancellationToken)
    {
        return await accountService.GetOneUserAsync(userId, cancellationToken);
    }

    public async Task<VmUserInfo?> FindByNameAsync(
        string normalizedUserName,
        CancellationToken cancellationToken
    )
    {
        return await accountService.GetUserInfoByNameAsync(normalizedUserName, cancellationToken);
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

代码解释

这是一个 ASP.NET Core Identity 框架的自定义用户存储实现类。

类定义

public sealed class UserInfoStore(IAccountService accountService) : IUserStore<VmUserInfo>
  • sealed: 密封类,不能被继承
  • 主构造函数: 使用 C# 12 的主构造函数语法,注入 IAccountService 依赖
  • 实现接口: IUserStore<VmUserInfo> - ASP.NET Core Identity 的核心用户存储接口

主要功能

1. 用户属性访问方法

方法功能
GetUserIdAsync获取用户 ID
GetUserNameAsync获取用户名
SetUserNameAsync设置用户名(含空值检查)
GetNormalizedUserNameAsync获取规范化用户名
SetNormalizedUserNameAsync设置规范化用户名(含空值检查)

2. CRUD 操作

CreateAsync, UpdateAsync, DeleteAsync

这三个方法都抛出 NotImplementedException,表示未实现增删改功能,只支持查询。

3. 查询方法

  • FindByIdAsync: 通过用户 ID 查找用户,委托给 accountService.GetOneUserAsync
  • FindByNameAsync: 通过用户名查找用户,委托给 accountService.GetUserInfoByNameAsync

设计特点

  1. 只读存储: 只实现了查询功能,不支持创建/更新/删除
  2. 委托模式: 实际业务逻辑委托给注入的 IAccountService
  3. 异步包装: 使用 Task.Run 包装同步操作(虽然对于简单属性访问可能不必要)
  4. 参数验证: 对可空参数使用 ArgumentNullException.ThrowIfNull 进行验证

适用场景

适合只读认证场景,例如:

  • 用户数据由外部系统管理
  • 仅需要身份验证,不需要用户注册功能
  • 与现有账户系统集成
评论加载中...