4

私が「スプリングラップ」している従来のデータベースには、文字列であり、いくつかの情報を提供する Id があります。たとえば、UserId は "DK-6715-00001" のように見えます。これは、デンマークの郵便番号 6715 のユーザーを意味します。これはエンタープライズ アプリケーションに非常にラップされているため、保持する必要があり、私のエンティティはセッター メソッドでこれを検証します。

ただし、ユーザーには国と郵便番号のフィールドもあるため、Bean の Id が設定されている場合は、国と郵便番号も設定する必要があります。このためには、CountryService が Dk がデンマークの Country オブジェクトであることを検索し、PostalService で新しく見つかった Country オブジェクトで 6715 を検索する必要があります。

まず、Entity オブジェクトから CountryService と PostalService にアクセスできるように接続できますか? (私の Bean 定義では、エンティティはサービス オブジェクトよりもずっと前に定義されています) 第二に、これは優れた設計原則に違反するはずです。エンティティがサービス Bean への参照を保持できるようにするために、私ができるより良い設計はありますか?

乾杯

ニック

4

3 に答える 3

4

設計に関するアドバイスをお探しの場合は、私の $0.02: エンティティはサービス Bean への参照を持たないでください。サービスはエンティティで動作する必要があり、その逆ではありません。そのため、エンティティ クラスの 1 つでサービスへの参照が必要であることがわかった場合は、エンティティ クラス内にビジネス ロジックが多すぎることを示している可能性があります。経験則として、ビジネス ロジックは、ロジックがその単一のオブジェクトのみを処理するか、非常に単純 ( equalsメソッドなど)である限り、エンティティ クラス内で問題ありません。ただし、ビジネス ロジックが「エンティティ間」(複数のエンティティ オブジェクトを含む) である場合は、サービス Bean で実装する必要があります。

私の考えを気にせず、デザインを機能させたいだけの場合: AspectJ を使用してエンティティ内に Spring Bean 参照を挿入できます。追加のコンパイル手順や AsjectJ によるランタイム サポートが必要だと思います。Spring ではサポートされていないnewキーワードを使用してエンティティ オブジェクトを作成するときに、サービス オブジェクトを注入する必要があるため、Spring でこれを行う方法はありません。

于 2009-09-30T15:03:06.300 に答える
1

これは、コントローラーに配置する必要があるロジックのようです。

その UserCreationController (可能であれば UserService を追加) には、これらの CountryService または PostalService への参照、および (おそらく) アプリに応じて JdbcService または HibernateService への参照が必要です。

エンティティークラス (または POJO) は、単純さを重視するべきです。

編集:2つを分離するのはビジネスロジックです。コントローラーはフォーム データを受け取り、それをドメイン エンティティにマップし、ビジネス ロジック (サービス) を呼び出し、その結果に基づいてユーザーの移動先を決定します。

于 2009-09-30T15:29:09.093 に答える
0

ご意見ありがとうございます。これは確かに設計上の欠陥であり、間違った方法で考えていたと判断しました。Id プロパティの setter-method を完全に削除し、getter だけを用意してから、Id を構成する他のプロパティの setter と getter を用意する必要があります。こうすれば、ID の書式設定が正しいことを確認するために懸命に作業する必要がなくなり、どのサービスにもアクセスする必要がなくなります。

乾杯

ニック

于 2009-09-30T20:51:40.863 に答える