6

バックエンド/データベースからのデータの CRUD 操作を主に構成する Web アプリケーションを構築しています。ビジネス ロジックを書かなければならない場合があります (開発を深めるにつれて、より多くのビジネス ロジックが構築されると確信しています)。現在、私が作成している各 UI 画面に対して、モデル クラス、サービス クラス、DAO クラス、コントローラー (本質的にはサーブレット)、および jsp ページの束を作成しています。ほとんどの場合、サービス クラスは DAO からメソッドを呼び出してモデル オブジェクトを渡すだけです。基本的にモデル クラスを使用して、UI 画面からデータをマッピングします。したがって、フォームが送信されると、コントローラにはモデル オブジェクトが設定されます。サービス クラスを使用して、Web レイヤーから DAO レイヤーへの分離レイヤーを維持し始めました。しかし、サービスクラスが不要なレベルの API 呼び出しを追加しているだけだと感じることがあります。DAO を Controller に挿入するだけで、タスクをより速く完了できると思います。実行する追加のビジネス ロジックがある場合にのみ、サービス クラスを使用したいと考えています。アプリケーションを設計する必要がある場合、controller->DAO と controller->Service->DAO 制御フローを使用して、どの要素を考慮しますか?

4

4 に答える 4

11

DAO はより細かく、1 つの特定のエンティティを扱います。サービスはマクロ レベルの機能を提供し、複数の DAO を使用することになります。通常、サービスは、原子性を得るためにトランザクション境界を定義するために使用されます。つまり、複数の DAO を使用して複数のテーブルを更新することになった場合、サービスでトランザクション境界を定義すると、DB に対して行われたすべての変更をコミットまたはロールバックするのに役立ちます。

あなたの設計では、主にさまざまなエンティティに対して CRUD を行っているため、サービスはあまり価値を追加していないように見えるかもしれません。ただし、Web ベースのフロント エンドは、データを更新する 1 つの方法と考えてください。サービスを使用すると、Web サービスと同じ機能を後でサードパーティのインテグレーターなどの他の形式のクライアントに公開できます。

つまり、要約すると、あなたのデザインは従来の慣行に沿っているようです。コードのオーバーヘッドを削減できるように、共通のテーマに基づいて複数のサービスを 1 つに組み合わせることができると思われる場合は、先に進んで実行してください。結局のところ、最終的な目標は、必要が生じたときに誰も変更を恐れない保守可能なコードを作成することです。

于 2013-04-26T10:18:31.950 に答える
1

Pro-Spring-3の本では、JPA2を使用したコントローラーについて、以下の行に言及しました

Once the EntityManagerFactory had been properly configured, injecting it into your service layer
classes is very simple.

以下のように、サービスとリポジトリと同じクラスを使用しています。

package com.apress.prospring3.ch10.service.jpa;
// Import statements omitted
@Service("jpaContactService")
@Repository
@Transactional
public class ContactServiceImpl implements ContactService {
private Log log = LogFactory.getLog(ContactServiceImpl.class);
@PersistenceContext
private EntityManager em;
// Other code omitted
}

ただし、spring-data CRUDRepository または JPARepository を使用する場合は、DAO がインターフェイスになり、コードを処理するサービス レイヤーを作成する必要があります。

于 2013-04-27T10:36:31.673 に答える
0

複数の集約ルートを扱う場合は、サービス クラスを使用します。

リポジトリ (別名コレクションを返す dao) または dao をコントローラーに直接挿入します。基本的な get を実行するための追加のレイヤー/クラスは必要ありません。

必要な場合にのみサービス クラスを使用してください。そうしないと、必要なコードが 2 倍になります。

リポジトリを汎用化@Transactional(propagation = Propagation.REQUIRED)し、トランザクションが存在することを強制する注釈を付けることができますが、既に存在する場合は新しいトランザクションを作成しません。したがって、後で 1 つのサービス クラス メソッドで複数のリポジトリを使用する場合、トランザクションは 1 つだけになります。

于 2013-04-26T11:55:06.987 に答える