You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:21:00