2017-08-01 88 views
3

在'clean architecture'中,交互者(用例)负责定义商业逻辑。大多数的例子定义使用情况以这样的方式:清洁架构 - 如何解决数据库事务?

public MyUseCase() { 

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

交互件大多使用简单的CRUD像库操作或查询。 上述示例对于简单的情况是同步的,但您可以使用异步解决方案(如回调或rxjava)的相同方法来找到回购站。

但是,如何使用案例inegrity。例如,插入a后,在插入b时,您仍不能100%确定。 如果在插入a后插入b会出现一些RepositoryException。

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

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

回答

3

这个答案可能有些晚了,但我一直在努力解决同样的问题,并得出结论认为,事务管理实际上是用例的一部分,例如“如果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() 
    } 
} 

名称可能会有所不同抽象掉完整性机制,但这个想法是一样的。我希望这会帮助某人。