2016-08-26 15 views
0

私はエンティティAnimalを持っています。それは2人の子供を持っています:犬と猫。動物はmakeVoice()を使うことができますが、CatsとDogはそれを別々に行います。Spring jpaエンティティと動的ディスパッチ

ここでは、Hibernateを使ってDogのインスタンスを取得し、DogのmakeVoice()メソッドでHumanServiceを呼び出しますが、Spring Bean、Singletonです。これをどうやって設計すればいいですか? HumanServiceの注入/自動ワイヤリングはCat/Dogのポーリングのようですが、これは動的に解決されなければなりません。私は、この解決策を外部にデザインする方法を考えることができません。そのような方法はありますか?

+0

'Dog'は' HumanService'を必要とする場合HumanServiceと通信して犬と一緒の方法でDogServiceを、私はしないでくださいそれを注入すると "犬"を汚染するだろうと思う。その依存関係を注入しています! – Adam

答えて

1

あなたの動物がサービスを呼び出す場合、あなたのデザインはドメイン主導型だが完全ではないようだ。 DDDがある場合は、サービスサフィックスのためにHumanServiceと呼ぶことはありません。私は犬が人間と直接コミュニケーションするのではなく、想像しています。

私は、サービスレイヤーやドメインオブジェクト間の通信ではなく、それらを混在させないようにする必要があると思います。もちろん、DDDではサービスを持つことができますが、それが適切な場合は、ドメインの2つのオブジェクト間の通信ではありません。

春の豆とJPAエンティティを混在させると、実際には少し厄介なように見えますが、ロジック上ではなく、2つの異なるライブラリを使用して同じクラスに振る舞います。
JPAはエンティティのインスタンス化にSpringを使用しないので、両方を行うにはトリックを使用する必要があります。 ロジックを追加するために大きなオーバーヘッドを追加せずにエンティティでSpringを使用することを避けることができれば、設計がよりクリーンになると思います。それ以外の場合は、トリックを使用します。両方があなたを困ら混合、DDDを使用しませんが、サービスによって設計使用している場合は

:パラメータが

+1

が受け入れられ、同じ結論に達しました。他の答えは、設計上の問題に焦点を当てるのではなく、それを行うためにトリックを提供しようとします。 Sheeesh – Sarief

+0

@Sarief完全に正しい。読解可能で標準的なデザインを使用することは、開発において最も重要なことの1つです。選択肢がない場合にのみ、読みやすさと標準を失うことを承諾する必要があります。 – davidxxx

+0

さて、私は何が起こっていたのか完全には分かっていませんでしたが、今ここで少し学んだのはexplanaitionです。私のコアモジュールはビジネスロジック用のサービスレイヤーを使用し、実装しようとしたモジュールはDomain to impementビジネスロジックを使用します。私の知識は私が始めた時には欠けていましたが、今私はそれを知っています、私は言うことができます。答えは本当に素晴らしく、悲しいかな、理解不足の私だった。 – Sarief

関連する問題