MST
星途 面试题库

面试题:TypeScript实现领域驱动设计中的仓储模式

基于领域驱动设计,使用TypeScript实现一个仓储模式。假设存在一个用户领域,用户具有姓名、邮箱、年龄等属性。要求你设计一个用户仓储接口及其实现类,使用TypeScript的泛型和接口等特性,并且要考虑到如何通过仓储模式来隔离数据访问层与领域层,同时保证代码的可测试性和可维护性。
12.7万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 定义用户领域模型
export interface User {
    name: string;
    email: string;
    age: number;
}
  1. 定义用户仓储接口
export interface UserRepository<T> {
    save(user: T): Promise<void>;
    findById(id: string): Promise<T | null>;
    findAll(): Promise<T[]>;
}
  1. 实现用户仓储类
import { User } from './User';

export class InMemoryUserRepository implements UserRepository<User> {
    private users: User[] = [];

    async save(user: User): Promise<void> {
        this.users.push(user);
    }

    async findById(id: string): Promise<User | null> {
        // 这里假设每个用户有一个唯一标识,可以通过某种方式生成,这里简单用index作为示例
        const index = parseInt(id, 10);
        return this.users[index] || null;
    }

    async findAll(): Promise<User[]> {
        return this.users;
    }
}
  1. 使用示例
async function main() {
    const userRepository = new InMemoryUserRepository();
    const user: User = { name: 'John Doe', email: 'johndoe@example.com', age: 30 };
    await userRepository.save(user);
    const allUsers = await userRepository.findAll();
    console.log(allUsers);
}

main();

通过以上代码,我们实现了一个简单的基于领域驱动设计的仓储模式。在这个模式中,UserRepository接口定义了数据访问的抽象方法,InMemoryUserRepository类实现了这些方法,负责具体的数据操作。这样就有效地隔离了数据访问层与领域层,提高了代码的可测试性和可维护性。例如,在测试业务逻辑时,可以使用一个模拟的UserRepository实现,而不依赖于实际的数据存储。如果需要更换数据存储方式(如从内存存储改为数据库存储),只需要修改UserRepository的具体实现类,而不会影响到领域层的业务逻辑。