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


8

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

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

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

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

更新:

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

回答:


7

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

あなたの場合、DDD の集合体の概念を見る必要があると思います。

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

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


確かにアグリゲートについては知っています。PassengerがAggregateで、すべての旅客パスポートが含まれている場合、パスポートを追加または削除するためのメソッド(メソッドはサーバーAPIを呼び出す)をPassengerオブジェクト内に配置する必要がありますか?
tikhop

@tikhop:コードに含まれていないと確実に知るのは難しいですが、私はそう思います。
pdr

0

サービスに追加のリポジトリがあるため、自分を責める必要がないことは、@ 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(...);

   }


}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.