2017-08-01 8 views
3

'クリーンアーキテクチャ'では、インタラクタ(ユースケース)がビジネスロジックを定義します。例のほとんどは、このような方法で、ユースケースを定義します。クリーンなアーキテクチャ - データベーストランザクションに対処する方法?

public MyUseCase() { 

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

インターアクターは、リポジトリ上の操作やクエリなどのほとんどは、単純なCRUDを使用しています。 上記の例はシンプルな場合と同期していますが、コールバックやrxjavaなどの非同期ソリューションを使用して同じ手法でreposを見つけることができます。

しかし、ユースケースの不公平はどうですか?たとえば、aを挿入した後も、bを挿入してもまだそこにあることを100%保証することはできません。 aを挿入した後で、bを挿入しているときにRepositoryExceptionが発生する場合はどうなりますか?私がこれまで見てきた

すべてのレポを考慮に入れ、それを取ることはありませんので、私の質問は次のとおりです。

クリーンなアーキテクチャでは、上記の問題の解決策は何ですか?

答えて

3

この回答はちょっと遅いかもしれませんが、私は同じ問題を抱えて苦労し、実際にトランザクション管理がユースケースの一部になっているという結論に達しました。「Bに何か問題が生じた場合は、状態"。

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() 
    } 
} 

名前は抽象化の完全性機構に異なる場合がありますが、考え方は同じです:だから、明示的にこのように、おそらく「DataManagerRepo」のいくつかの種類で、あなたのユースケースの中に記載すべきことができます。これが誰かを助けることを願っています。

関連する問題