12

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

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你得到一些 RepositoryException 而插入b.

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

清洁架构中上述问题的解决方案是什么?

4

1 回答 1

12

这个答案可能有点晚了,但我一直在努力解决同样的问题并得出结论,事务管理实际上是用例的一部分——比如,“如果 B 出现问题,恢复 A 的状态”。因此,它可以而且应该在您的用例中明确说明,可能使用某种“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()
    }
}

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

于 2017-09-07T06:20:11.377 回答