【问题标题】:Clean Architecture - how to address database transactions?清洁架构 - 如何处理数据库事务?
【发布时间】:2023-03-05 14:22:01
【问题描述】:

在“干净架构”中,交互器(用例)负责定义业务逻辑。大多数示例都以这样的方式定义用例:

public MyUseCase() {

  public boolean execute(...) {
    int id = repository.insert(a)
    if(id > 0) {
      b.aId= id;
      repository.insert(b);
      ...
    }
  }
}

交互器主要使用简单的 CRUD 之类的操作或对存储库的查询。 为简单起见,上面的示例是同步的,但您可以使用回调或 rxjava 等异步解决方案以相同的方法找到 repos。

但是用例的不完整性怎么办。例如,您不能 100% 确定插入 a 后,当您插入 b 时它仍然存在。 如果在插入 a 后,您在插入 b 时遇到 RepositoryException 怎么办。

到目前为止我看到的所有回购都没有考虑到它,所以我的问题是:

上述干净架构问题的解决方案是什么?

【问题讨论】:

    标签: clean-architecture interactors


    【解决方案1】:

    这个答案可能有点晚了,但我一直在努力解决同样的问题并得出结论,事务管理实际上是用例的一部分 - 例如,“如果 B 出现问题,则恢复 A 的状态”。因此,它可以而且应该在您的 UseCase 中明确说明,可能使用某种“DataManagerRepo”,如下所示:

    public MyUseCase() {
    
        public boolean execute(...) {
            dataManagerRepository.openTransaction()
            try {
                int id = repository.insert(a)
                if(id > 0) {
                b.aId= id;
                repository.insert(b);
                ...
            }
            catch (MyException exc) {
                dataManagerRepository.rollbackTransaction()
            }
    
            dataManagerRepository.commitTransaction()
        }
    }
    

    名称可能会有所不同以抽象出完整性机制,但想法是相同的。我希望这会对某人有所帮助。

    【讨论】:

    • 如果一个用例包含两个或多个用例,该解决方案将如何工作?如果单个用例需要跨两个或多个存储库运行,此解决方案将如何工作?
    • 可以添加你的dataManagerRepository的代码吗?
    • @SeanStayns 它不存在,都是我编的
    猜你喜欢
    • 2020-09-16
    • 2020-12-12
    • 1970-01-01
    • 2022-01-16
    • 2019-04-17
    • 2022-10-14
    • 2020-07-17
    • 2020-07-07
    • 2021-12-23
    相关资源
    最近更新 更多