Skip to content

浅析后端三层架构

什么是三层架构?

3层架构是一种软件架构设计模式,它将应用程序划分为三个主要的逻辑层:

  1. 控制层(Controller Layer)
  2. 业务逻辑层(Service/Logic Layer)
  3. 数据访问层(DAO/Repository Layer)

这种架构模式遵循了"关注点分离"的设计原则,使得每一层都能专注于自己的核心职责。

为什么需要三层架构?

在没有分层架构的情况下,所有的代码逻辑都混杂在一起,这会导致以下问题:

  • 代码难以维护和理解
  • 功能之间耦合度高
  • 代码重用性差
  • 测试困难
  • 系统扩展性差

通过采用3层架构,我们可以有效地解决这些问题。

每层的具体职责

1. 控制层(Controller Layer)

控制层是整个应用的入口,主要职责包括:

  • 接收和处理HTTP请求
  • 参数校验和请求数据转换
  • 调用业务逻辑层处理业务
  • 处理响应结果并返回给客户端
  • 异常处理和日志记录

示例代码:

typescript
@Controller('users')
export class UserController {
    constructor(private userService: UserService) {}
    
    @Get(':id')
    async getUser(@Param('id') id: string) {
        return await this.userService.findById(id);
    }
}

2. 业务逻辑层(Service/Logic Layer)

业务逻辑层是整个应用的核心,主要职责包括:

  • 实现具体的业务逻辑
  • 处理业务规则和业务流程
  • 数据的加工和转换
  • 调用数据访问层进行数据操作
  • 事务管理

示例代码:

typescript
@Injectable()
export class UserService {
    constructor(private userRepository: UserRepository) {}
    
    async createUser(userData: CreateUserDto) {
        // 业务逻辑处理
        const existingUser = await this.userRepository.findByEmail(userData.email);
        if (existingUser) {
            throw new ConflictException('邮箱已存在');
        }
        
        // 密码加密等业务处理
        const hashedPassword = await this.hashPassword(userData.password);
        
        // 调用数据访问层
        return await this.userRepository.create({
            ...userData,
            password: hashedPassword
        });
    }
}

3. 数据访问层(DAO/Repository Layer)

数据访问层负责与数据库交互,主要职责包括:

  • 执行数据库的CRUD操作
  • 封装数据库访问细节
  • 提供数据持久化服务
  • 数据模型的定义和映射

示例代码:

typescript
@Injectable()
export class UserRepository {
    constructor(@InjectModel(User.name) private userModel: Model<User>) {}
    
    async findById(id: string): Promise<User> {
        return await this.userModel.findById(id).exec();
    }
    
    async create(userData: CreateUserDto): Promise<User> {
        const user = new this.userModel(userData);
        return await user.save();
    }
}

三层架构的优势

  1. 高内聚,低耦合

    • 每一层都有明确的职责
    • 层与层之间通过接口通信
    • 各层可以独立变化而不影响其他层
  2. 可维护性

    • 代码结构清晰
    • 易于定位问题
    • 便于代码重构
  3. 可测试性

    • 各层可以独立测试
    • 便于编写单元测试
    • 支持测试驱动开发(TDD)
  4. 可重用性

    • 业务逻辑可以被多个控制器复用
    • 数据访问层可以服务于不同的业务逻辑
    • 减少代码重复
  5. 可扩展性

    • 易于添加新功能
    • 方便集成新的技术
    • 支持水平扩展

最佳实践

  1. 遵循单一职责原则

    • 每一层只负责自己的核心任务
    • 避免跨层调用
    • 保持层次结构清晰
  2. 使用依赖注入

    • 降低组件间的耦合
    • 提高代码的可测试性
    • 方便进行单元测试
  3. 统一异常处理

    • 在控制层统一处理异常
    • 定义清晰的错误码和错误信息
    • 提供友好的错误响应
  4. 规范数据传输对象

    • 使用DTO进行数据传输
    • 在不同层之间转换数据格式
    • 保护敏感数据

总结

3层架构是一种经典且实用的架构模式,它通过清晰的职责划分和良好的解耦设计,帮助我们构建可维护、可扩展的应用程序。在实际开发中,我们应该根据项目的具体需求,合理运用这种架构模式,同时也要注意避免过度设计,保持架构的简洁性和实用性。

本站所有内容均为原创,转载请注明出处