Flutter项目Clean Architecture下实体划分与跨功能共享咨询
Flutter Clean Architecture 实体设计最佳实践解答
问题1:嵌套JSON结构的实体与模型拆分方案
首先要明确Domain层Entity(业务实体)和Data层Model(数据模型)的职责边界,两者不要混淆:
- Domain层的Entity只保留业务逻辑需要的字段,完全不需要感知接口的外层返回结构。比如你登录场景的业务只需要token、用户信息、账户信息、权限列表,那Domain层只需要定义
AuthEntity、UserEntity、AccountEntity三个实体即可,不需要把status、message这类接口公共字段放到Domain层。 - Data层可以封装泛型通用响应结构减少重复代码,你提到的通用IResponse接口思路是可行的,直接定义泛型类
BaseResponse<T>,封装status、message、data三个公共字段,T对应每个接口的业务data类型即可,不需要每个接口都重复写外层字段。 - 嵌套对象是否要单独拆分:如果该嵌套对象有独立的业务逻辑(比如User会在多个场景单独使用、Account信息会单独做权限校验),就单独拆分为对应的Entity和Model;如果只是附属的一次性字段,不需要单独处理。
参考代码示例:
// Domain层 通用用户实体 class UserEntity { final int userId; final String email; final String firstName; final String lastName; // 其他业务需要的字段 const UserEntity({required this.userId, required this.email, /*...*/}); } // Data层 通用响应基类 class BaseResponse<T> { final String status; final String message; final T? data; BaseResponse({required this.status, required this.message, this.data}); // 通用fromJson方法,传入T的fromJson实现 factory BaseResponse.fromJson(Map<String, dynamic> json, T Function(dynamic) fromJsonT) { return BaseResponse( status: json['status'], message: json['message'], data: json['data'] != null ? fromJsonT(json['data']) : null, ); } } // Data层 登录接口专属数据模型 class LoginResponseDataModel { final String token; final UserModel user; final AccountModel accountData; final List<String> permissions; LoginResponseDataModel({/*...*/}); factory LoginResponseDataModel.fromJson(Map<String, dynamic> json) {/*...*/} // 转Domain层AuthEntity的方法 AuthEntity toEntity() => AuthEntity( token: token, user: user.toEntity(), account: accountData.toEntity(), permissions: permissions ); }
这种方案的优势是后续如果接口外层字段调整,只需要改BaseResponse即可,Domain层的业务逻辑完全不受影响。
问题2:跨模块实体共享规则
允许共享,但是要遵守两个边界:
- 仅共享Domain层的通用业务实体,不要共享Data层的Model。因为Model是和接口/数据源绑定的,不同模块的接口返回的同类型数据结构可能有差异,每个模块的Model应该自己实现,最终都转为通用的Domain层Entity供业务层使用。
- 共享的实体必须是多个模块通用的核心业务对象,比如你提到的UserEntity,在Auth、Employee等多个模块都会用到,就可以抽到全局通用的
common/domain/entities目录下,所有业务模块都依赖这个公共实体即可。如果某个模块有专属的扩展字段需求,可以基于通用实体扩展模块内的专属实体,不要硬往通用实体里加非通用字段避免冗余。
内容的提问来源于stack exchange,提问作者Hunt
相关产品推荐
相关产品推荐

