Dailyuse Account thought1
重新深度构思一下 Account 模块的实现。
#status / growing
#type / journal
#tech / dev
Dailyuse-Account-thought1
[!info] related notes
- 所属 MOC: Daily Use MOC
- 相关主题: account-module, dailyuse-account-module-diary
相关文档
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 模块的对象结构应该是可以无限扩展的。应该是一个比较优雅的实现方式。