2016-07-07 11 views
2

私のアプリケーションには3つのサービスクラスがあります。各サービスクラスはそれぞれのDAOインターフェイス&の実装クラスで特定の機能に対して記述されています。 すべてのサービスには異なるパッケージがあります。1つのDAOのメソッドを別のものに使用する

は私が

AService.java & ADAO.java ADAOインターフェースはAService.javaクラス内に注入されるがあるだろう。同様に私は

BService.java & BDAO.java 

CService.java & CDAO.java 

今、私はそれを行うための最善の方法はどうあるべきかAService.java

にBDAO & CDAO実装クラスのいくつかのメソッドを参照したいですか?

  1. 私はAService.javaにBDAO & CDAOを注入。それはいい練習ですか?このシナリオでは、サービスは緊密に結合されています。

  2. それぞれのDAOに冗長コードを書きます。

  3. 私は一般的なDAOを作成します。&すべての一般的なメソッドをすべての個々のDAOから抽出しようとします。&これは大規模な作業です。どのDAOがどの特定のサービスに必要とされるのか、将来、どのような方法であるかについてはわかりません。

+3

する必要があります。機能的なサービスがさまざまなエンティティからのデータにアクセスし、いくつかのDAOを使用する必要があることは完全に正常です。 –

答えて

5

この場合、最初のオプションを使用します。サービスは、DAOよりも高いレベルの抽象化を持つことができます。

2番目の方法では行かないことを確かめてください.3番目のオプションは、共通コードがいくつかのユーティリティコードであれば有効ですが、共通コードが異なるエンティティ/論理ドメインにある場合は実行しません。

+0

私は最初のオプションを提案することに同意しません。他のドメインからDAOを注入し、ビジネスロジック層をバイパスするのは良い考えではありません。それともコントローラーで同じことをやろうか? – d0x

3

DAOレイヤで動作を共有する場合は、DAOレイヤ内で継承または合成(アソシエーション)を使用して動作を行う必要があります。

あなたが「A」、「B」、「C」のようなドメインでアプリケーションをスライスし、そう AServiceB-ドメインで実装さBのロジックのいずれかの種類にアクセスすることはない BService渡すことでなければなりません。

@oliver-gierke talk "Whoops! Where did my architecture go?"を参照してください。このため、簡単にバイパスする彼は、他の「ドメイン」は、あなたのドメインのDAOSを使用していないことをあなたが強制これにより、この

public  class com.product.a.AService 
/*package*/ class com.product.a.ADao 

public  class com.product.b.BService 
/*package*/ class com.product.b.BDao 

public  class com.product.c.CService 
/*package*/ class com.product.c.CDao 

のようなパッケージを整理することを提案しています。それ以外の場合は、アーキテクチャのルールに違反する可能性があります。

異なるドメインのDAOを共有する際の問題は、他のドメインのサービスレイヤで実装されているビジネスロジックをバイパスできることです。 たとえば、「削除」操作がすべてBにある場合、電子メールを顧客に送信する必要があります。 AServiceBRepositoryを直接使用する場合、Bインスタンスを削除するためのアクセスを許可し、ロジックをバイパスして電子メールを送信します。

+0

「共通の機能」を持つ「共通の」DAOクラスを作成すると、必要に応じて他のDAOによって拡張される可能性があります。ありがとう。 – DarkPurpleShadow

関連する問題