面试题答案
一键面试- 定义用户领域模型:
export interface User {
name: string;
email: string;
age: number;
}
- 定义用户仓储接口:
export interface UserRepository<T> {
save(user: T): Promise<void>;
findById(id: string): Promise<T | null>;
findAll(): Promise<T[]>;
}
- 实现用户仓储类:
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;
}
}
- 使用示例:
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
的具体实现类,而不会影响到领域层的业务逻辑。