Flutter Clean Architecture中UseCase是否需要对应实现类?
Flutter Clean Architecture中UseCase是否需要实现类?
结论:UseCase通常不需要单独的Implements实现类,原因和正确写法如下:
核心逻辑:UseCase的定位
在Clean Architecture里,领域层的核心职责是定义业务规则和核心逻辑:
- Entity是业务实体,无依赖;
- Repository是抽象契约,用来定义数据访问的接口,由数据层(RepositoryImpl)去实现,目的是隔离数据源(本地/远程)的变化对领域层的影响;
- 而UseCase本身就是领域层业务逻辑的具体实现单元——它的作用就是把复杂业务拆分成一个个独立的、可复用的执行单元,本身就是"实现",不需要再额外写一层Impl。
你当前代码的问题
你给出的代码存在违反依赖倒置原则的问题:
class TodoUseCases { final todoRepo = TodoRepositoryImpl(); // 直接依赖具体实现,领域层不该耦合数据层 Future<Either<Failure, List<TodoEntity>>> getTodo() async { return todoRepo.getTodoFromDataSource(); } }
这里直接在UseCase里实例化了TodoRepositoryImpl,导致领域层和数据层强耦合,失去了Clean Architecture分层解耦的意义。
正确的写法
UseCase应该依赖抽象的Repository,通过构造函数注入具体实现:
1. 领域层定义抽象Repository
// 领域层 - 数据访问契约 abstract class TodoRepository { Future<Either<Failure, List<TodoEntity>>> getTodoFromDataSource(); }
2. 领域层的UseCase依赖抽象
// 领域层 - UseCase(业务逻辑实现) class TodoUseCases { final TodoRepository todoRepo; // 通过构造函数注入抽象,而非直接实例化具体类 TodoUseCases(this.todoRepo); Future<Either<Failure, List<TodoEntity>>> getTodo() async { return todoRepo.getTodoFromDataSource(); } }
3. 数据层实现Repository
// 数据层 - Repository具体实现 class TodoRepositoryImpl implements TodoRepository { @override Future<Either<Failure, List<TodoEntity>>> getTodoFromDataSource() { // 具体的数据源逻辑(比如调用API、操作本地数据库) } }
4. 在外部注入实现
比如在Presentation层或者依赖注入容器中,把TodoRepositoryImpl传入UseCase:
// 示例:在ViewModel中注入依赖 final todoUseCases = TodoUseCases(TodoRepositoryImpl());
总结
- UseCase本身就是业务逻辑的具体实现,不需要额外的Impl层;
- 关键是要遵循依赖倒置,让UseCase依赖抽象的Repository而非具体实现,这样才能保证领域层的独立性。
内容的提问来源于stack exchange,提问作者CCP
相关产品推荐
相关产品推荐

