0

私は新しいアプリケーションを構築していて、ドメイン駆動設計に不慣れです。私はドキュメントを読み、ドメインモデルのほとんどをモデル化することができましたが、2つのクエリについてアドバイスが必要です。

  1. 2つのドメインオブジェクトチャネルとプログラムがあります。どちらも独立してアクセスできるため、これらを両方ともエンティティとしてモデル化しました。チャンネルはプログラムのリストを持つことができるので、これをチャンネルの属性として入れました。私の質問は、プログラムリストにどのように入力するかです。ChannelServiceのgetChannerByIdメソッドが最初にチャネル情報を取得し、次にProgramServiceを呼び出してチャネルのプログラムのリストを取得しても問題ありません。例:

    Channel {
      String channelId
      List <Program> programList
    }
    
    Program {
      String programId {
    }
    
    ChannelService {
       Channel getChannelById(String channelId)
    }
    
    ProgramService {  
       Program getProgramById(String programId)
       List <Program> getProgramsByChannelById(String channelId)  
    }
    
  2. 製品ドメインオブジェクトがありますが、その属性の一部(仕様や互換性など)には、非常に時間のかかる操作が含まれます。これらの属性は常に必要なわけではないので、これらをドメインオブジェクトの一部として配置し、必要に応じてこれらの属性を設定する個別のサービスメソッドを使用してもかまいません。

    Product {
        String productId
        Specification specification
        List <Product> compatibleProducts
    }
    
    ProductService {
        Product getProduct(String productId);
        void getProductSpecifications(Product product);
        void getCompatibleProducts(Product product);
    }
    

アドバイスをいただければ幸いです。

4

1 に答える 1

7

DDDでエンティティを設計するときは、あるエンティティから別のエンティティへの関連付けを作成して、関連付けが表示またはクエリの目的でのみ使用されるようにしないでください。チャネルに一連のプログラムがあることは事実ですが、チャネルとそのプログラムのセットとの間の関連付けは、チャネルエンティティに必要ですか?さらに重要なことに、クエリの側面のみを検討している場合は、コードにDDDを強制する必要がない場合があります。代わりに、エンティティを設計するときは、これらのエンティティが実装する必要のある動作を考慮してください。エンティティに動作がなく、データコンテナとしてのみ使用される場合は、DDDは必要ありません。あなたの質問に答えるために、私は各クエリの要件を満たす読み取りモデルクラスを使用します。たとえば、製品モデルの場合、1つのクエリで仕様属性が必要で、別のクエリでは必要ない場合、これらのクエリに対して個別の読み取りモデルクラスを作成します。これらのクラスはエンティティではなく、単純な読み取り専用の値オブジェクトであり、動作はなく、データを表すことが仕事です。クエリの実装に関しては、いくつかのオプションがあります。ChannelServiceとProgramServiceの両方を呼び出すことは1つのオプションです。ただし、データがすべて1つのデータベースにまとめて保存されている場合は、必要なすべてのデータを1回の呼び出しで返すリポジトリを作成してみませんか?私を見てください データがすべて1つのデータベースにまとめて保存されている場合は、必要なすべてのデータを1回の呼び出しで返すリポジトリを作成してみませんか?私を見てください データがすべて1つのデータベースにまとめて保存されている場合は、必要なすべてのデータを1回の呼び出しで返すリポジトリを作成してみませんか?私を見てくださいこのトピックの詳細については、DDDの読み取りモデルに投稿してください。

于 2012-05-22T16:54:53.463 に答える