2013-02-17 11 views
14

ウェブで見つかった例について少し混乱しています - spring & hibernate(ポイント4. Model & BO & DAO) Model、DAO、BOのクラス(+ DAOとBOのインタフェース)があります。私が明確に理解していないのは、DAOとBOがまったく同じ機能を共有している場合、DAOとBOが別々のクラスに分かれている点です(違いはBOにDAOセッターがあることです)。少なくとも、(DAO&BO(データアクセス層) - アーキテクチャ

プロジェクト構造に混乱を避けるために、明確に

を層を識別するのに有用であるが、私には設計上-ようだ:

著者はパターンがあること、のみを説明しますこの場合)。私はこの例がとてもシンプルであることを知っていますが、このクラスの分離は何のために役立つでしょうか?誰かが例を挙げることができますか?

+1

古典的な例は、送金サービスです。 –

+1

DAOが分離されていない場合、BO(サービス)がDAOを再利用することは困難です。基本的なDBまたはORMフレームワークを変更した場合、DAOの実装部分だけが変更を必要とするため、影響を受けていないBOには影響がないなどの利点もあります。 – techuser

答えて

26

彼らがBOと呼ぶものは、ビジネスサービスのようです。 DAOの仕事は、永続性関連のコードを挿入することです:データベースの挿入、更新、クエリ。

サービスはトランザクションを区切り、ビジネスロジックを含み、通常このロジックを実装するために1つまたは複数のDAOを使用します。いくつかのユースケースでは、サービスはDAOに委任します。他の人には、1つまたは複数のDAOのいくつかのメソッドを呼び出します。私は1つのDAOには、データを_retrieve_な​​り、一方、1ののBOがデータを_hold_うimange

public void transferMoney(Long sourceAccountId, Long targetAccountId, BigDecimal amount) { 
    Account source = accountDAO.getById(sourceAccountId); 
    Account target = accountDAO.getById(targetAccountId); 
    if (source.getBalance().compareTo(amount) < 0) { 
     throw new NotEnoughMoneyException(); 
    } 
    source.decrementBalance(amount); 
    target.incrementBalance(amount); 
    auditDAO.insertTransaction(sourceAccountId, targetAccountId, amount); 
    // other business logic 
} 
+0

非常に良い例です、ありがとうございます。 – ducin

関連する問題