web-dev-qa-db-ja.com

DDD:サービスに2つのリポジトリーが含まれています

1つのサービス内に2つのリポジトリを持つ方法は正しいですか?それはアプリケーションまたはドメインサービスですか?

Passport(政府ID)オブジェクトを含むべきPassengerオブジェクトがあるとします。 PassengerRepositoryからPassengerを取得しています。 PassengerRepositoryはサーバーへのリクエストを作成し、受信したデータを解析してリポジトリ内に保存するよりもデータ(json)を取得します。

PassportをEntityとして保存してPassportRepositoryに入れたいので混乱しましたが、パスワードに関するすべての情報は、上記で受け取ったものよりもjson内部に含まれています。

removePassport, addPassport, getAllPassengerなどのいくつかのメソッドを使用してPassengerRepositoryとPassportRepositoryが含まれるPassengerServiceを作成する必要があると思います。

更新:

したがって、より良い方法はPassportをVOとして表し、すべてのパスポートをPassenger集約内に格納することだと思います。ただし、別の質問があります。管理乗客のパスポートのメソッド(メソッドはサーバーAPIを呼び出す)をどこに置くべきですか。乗客の集合体内のほうがいいと思います。

8
tikhop

サービスが2つのリポジトリを持つことは前例のないことではありませんが、多くの場合、デザインが貧弱であることのヒントです。設計を改善できるかどうかを確認するのは一見の価値がありますが、見ても改善できない場合でも、あまり心配する必要はありません。

あなたの場合、DDDで Aggregates の概念を検討する必要があると思います。

集合体は、一緒に属するもののグループです。集約ルートは、それらすべてをまとめて保持するものです。

PassengerとPassportが一緒に属していない場合、私は何をしているのかわかりません。この場合の集約ルートは明らかにPassengerです。

7
pdr

サービスに追加のリポジトリがあるため、自分を責める必要がないことは、@ pdrと完全に一致しています。

addPassportなどのパスポートメソッドについては、PassengerServiceとPassport Repositoryに保持する必要があると思います。何かのようなもの:

public class PassengerService : ServiceBase<Passenger>, IPassengerService {

    private readonly IPassportRepository _passport_repository;
    private readonly IPassengerRepository _pass_repository

    public PassengerService(IPassportRepository passport_repository,     IPassengerRepository passenger_repository) {
        ...

    }


   public void removePassport(...) {
       _passport_repository.remove(...);

   }


}
0
Gabriel Lopes