DDD: Dienst enthält zwei Repository

8

Ist es richtig, zwei Repositorys in einem Dienst zu haben, und handelt es sich um eine Anwendung oder einen Domänendienst?

Angenommen, ich habe ein Passagierobjekt, das ein Passport-Objekt (Regierungs-ID) enthalten soll. Ich bekomme Passagier von PassengerRepository. PassengerRepository erstellt eine Anforderung an den Server und ruft Daten (json) ab, als empfangene Daten zu analysieren und im Repository zu speichern.

Ich habe verwirrt, weil ich Passport als Entität speichern und in PassportRepository ablegen möchte, aber alle Informationen über das Passwort in json enthalten sind, als ich oben erhalten habe.

Ich denke, ich sollte einen PassengerService erstellen, der PassengerRepository und PassportRepository mit verschiedenen Methoden wie removePassport, addPassport, getAllPassengerund usw. enthält.

AKTUALISIEREN:

Ich denke also, dass der bessere Weg darin besteht, Passport als VO darzustellen und alle Pässe im Passagieraggregat zu speichern. Es gibt jedoch eine andere Frage: Wo soll ich die Methoden (Methoden ruft Server-API auf) für den Pass des Verwaltungspassagiers ablegen? Ich denke, der bessere Ort ist so innerhalb des Passagieraggregats.

Tikhop
quelle

Antworten:

7

Es ist nicht ungewöhnlich, dass ein Dienst zwei Repositorys hat, aber es ist oft ein Hinweis auf ein schlechtes Design. Es lohnt sich zu prüfen, ob Sie Ihr Design verbessern können, aber wenn Sie schauen und es nicht verbessern können, sollten Sie sich nicht zu viele Sorgen machen.

In Ihrem Fall müssen Sie sich das Konzept der Aggregate in DDD ansehen .

Aggregate sind Gruppen von Dingen, die zusammengehören. Eine aggregierte Wurzel ist das, was sie alle zusammenhält.

Wenn Passagier und Reisepass nicht zusammengehören, weiß ich nicht, was das bedeutet. Ihre Gesamtwurzel sollte in diesem Fall offensichtlich Passagier sein.

pdr
quelle
Ja, ich weiß mit Sicherheit über Aggregate Bescheid. Ok, wenn ein Passagier aggregiert ist und den gesamten Passagierpass enthält, wo ich die Methoden (Methoden ruft die Server-API auf) zum Hinzufügen oder Entfernen von Pässen in das Passagierobjekt einfügen soll?
Tikhop
@tikhop: Schwer zu wissen, ohne in deinem Code zu sein, aber ich würde es mir vorstellen, ja.
pdr
0

Ich stimme @pdr voll und ganz zu, dass Sie sich wegen eines zusätzlichen Repositorys in Ihrem Service keine Vorwürfe machen müssen.

Über die Passmethoden, wie addPassportich denke, sollten sie im PassengerService und im Passport Repository bleiben. Etwas wie:

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(...);

   }


}
Gabriel Lopes
quelle