Dailyuse Account thought1

重新深度构思一下 Account 模块的实现。

#status / growing #type / journal #tech / dev

Dailyuse-Account-thought1

[!info] related notes

相关文档

account-module

Overview

重新深度构思一下 Account 模块的实现。 根据 account-module 中讲的一个账户模块的核心需要:

  • 核心信息(账户的uuid、唯一用户名、状态等),
  • 还有就是安全的审计信息。

而“扩展信息”就是 Account 扩展的入口。

优雅的实现方式


export class Account extends AggregateRoot implements AccountServer {
  // 基本信息
  private _username: string;
  private _email: string;
  private _emailVerified: boolean;
  private _phoneNumber: string | null;
  private _phoneVerified: boolean;
  private _status: 'ACTIVE' | 'INACTIVE' | 'SUSPENDED' | 'DELETED';

  // 复杂对象
  private _profile: AccountServerDTO['profile'];
  private _preferences: AccountServerDTO['preferences'];
  private _storage: AccountServerDTO['storage'];
  private _security: AccountServerDTO['security'];
  private _stats: AccountServerDTO['stats'];

  // 时间戳
  private _createdAt: number;
  private _updatedAt: number;
  private _lastActiveAt: number | null;
  private _deletedAt: number | null;

  // 子实体
  private _subscription: Subscription | null;
  private _history: AccountHistory[];
}

上面是我之前实现的一个模块的结构。 使用的是DDD思想中的那个领域模型。 大体思想是一致的。上面也包括基础的扩展信息,还有核心信息。然后 history 信息则就是我们的审计信息。 认证信息应该完全交给 authentication 模块

此外,他这里还扩展了一个 subscription 信息。

评估一下,就是上面的实现有点混乱。

他应该按照前面讲的,将核心信息作为 Account 聚合根对象的基础属性,然后把扩展信息、认证信息等都可以提取成一个实体对象。 当后面需要添加,比如说是什么企业管理的功能,需要添加企业相关的职位信息等的时候,它就可以继续扩展那些扩展信息,比如再添加一个企业实体,用来给这个 account 添加企业相关的属性。

export class Account extends AggregateRoot implements AccountServer {
  // 基本信息
  private _username: string; //唯一
  private _status: 'ACTIVE' | 'INACTIVE' | 'SUSPENDED' | 'DELETED';
  // 时间戳
  private _createdAt: number;
  private _updatedAt: number;
  private _lastActiveAt: number | null;
  private _deletedAt: number | null;

  // 子实体
  private _subscription: Subscription | null;
  private _history: AccountHistory[];
  private _profile: AccounProfile;
  private _preferences: AccountServerDTO['preferences'];
  private _storage: AccountServerDTO['storage'];
  private _security: AccountServerDTO['security'];
  private _stats: AccountServerDTO['stats'];
}

所以理论上讲,只要按照的方法来,规划 Account 模块的对象结构应该是可以无限扩展的。应该是一个比较优雅的实现方式。

创建于 2026/1/24 更新于 2026/5/27