0

FowlerのPoEAAを読んだ後、データアクセス層を設計するための良い方法または自然な方法について本当に混乱しています。以前は、データアクセスオブジェクトに次のような単純なJavaBeanを返させていました。

public class Person {
    private long id;
    private String name;
    private Gender gender;

    //... setters and getters
}

そして、データアクセスオブジェクトは次のようなものです

public class PersonDataAccessImpl implements PersonDataAccess {
    public Person getPersonById(long id) throws DataAccessException {
        //... select the database
    }
    public void addPerson(Person person) throws DataAccessException {
        //... insert into the database
    }
    ...
}

Personオブジェクトは、上のデータアクセス層とWebプレゼンテーション層を含むアプリケーション全体で使用されます。しかし、PoEAAによると、データアクセス層は通常、層の最下部にあります。DAOをBeanオブジェクト(Person)に依存させるのは良い方法ではありませんか?これは後でドメイン層、サービス層、およびプレゼンテーション層で使用されます。そして、私の意見では、ドメインオブジェクトと単純なJava Beanの違いは、単純なJava Beanにはドメイン1の動作しかないということなので、ドメインレイヤーを設計する方法。

4

1 に答える 1

3

アプリケーションを設計するための真の方法は明らかにありませんが、私自身の考えは次のとおりです...

プレーンな Java Beanドメイン オブジェクトの主な違いは動作にあることに同意します。しかし、私は、ドメインオブジェクトに実際に動作を持たせる必要があると主張します。ゲッターとセッターのバッグである単なるオブジェクトではなく、ドメイン オブジェクトを使用してドメイン モデルを設計します。それがドメインの一部である場合、関連する動作が実際にある可能性があります。

データ アクセス オブジェクトが Person などのドメイン オブジェクトに依存することはまったく問題ありません。実際、これが完全に目的であると私は主張します。データ アクセスは、リレーショナル データ ストアとオブジェクト モデルの間のマップだと思います。実装の簡単なスニペットは、実際にはリポジトリに似ています。これは、ドメインとデータ マッピング レイヤーの間のメディエーターです。

プレゼンテーション レイヤーでドメイン オブジェクトを使用することを避け、軽量のデータ オブジェクトのみを表示用にクライアントに公開する必要があるという議論があります。(たとえば、ASP.NET MVC アプリケーションのビュー モデルクラスの一般的な考え方を参照してください。) サービス レイヤーは、基本的にドメイン オブジェクトからこれらのビュー オブジェクトに変換し、フロントエンド クライアントに提供します。これに対する重要な議論の 1 つは、不明なクライアントがサービスを使用する場合、ドメイン オブジェクトとすべてのビジネス ロジックへの完全なアクセス権を彼らに与えたくないということです。表示するために知っておく必要があることを彼らに提供したいだけです。ユーザーに。あなたがあなた自身の唯一のクライアントである場合、これはそれほど問題ではありません.

もちろん、常に複雑なドメイン モデルが必要なわけではありません。ドメイン オブジェクトが独自の永続性を管理する Active Record のようなものがあるかもしれません。また、クライアントにビュー情報を取得するためにドメイン モデルを完全にバイパスし、データの格納されたビューから調整されたビュー クラスに直接移行する CQRS などを検討することもできます。(ただし、ドメイン モデルは依然としてコマンド側で使用されています。)

私のアドバイス: 十分に複雑な場合は、次のようにします。

  • 動作を伴うオブジェクトのドメイン モデルを持つ
  • ドメイン モデルとデータ ストアの間を仲介するデータ アクセス レイヤーがある (これはドメイン オブジェクトによって異なります)
  • クライアントがデータを表示してポストバックするために必要なアプリケーションの操作を公開するサービス層を持っている
于 2013-01-22T21:31:47.083 に答える