3 Stimmen

Domain Driven Design Frage zu Services und Repositories

Ich habe zwei Entitäten Benutzer und Kurs. Ein Benutzer kann mehrere Kurse belegen, wodurch die Beziehung eins zu vielen entsteht. Aber ein einzelner Kurs kann von vielen Studenten belegt werden, so dass die Beziehung viele zu viele ist.

Jetzt muss ich einen Kurs für einen Benutzer registrieren. Meine Benutzerentität hat:

 public void AddCourse(Course course)
        {
            if (CoursesAlreadyAdded(course))
            {
                AddBrokenRule(new BrokenRule() { PropertyName = course.ClassCode, Message = String.Format("Course with classCode = {0} already added", course.ClassCode) });
                return;
            }

            UserCourses.Add(new UserCourse() { UserId = this.UserId, CourseId = course.CourseId, Course= course, User = this});
        }

Die Klassen werden durch Linq to SQL generiert. Linq to Sql ist nicht in der Lage, viele bis viele Beziehungen zu erstellen, so dass ich dies selbst tun muss.

Die Frage ist nun, wie ich die Informationen an die Datenbank übermitteln kann. Sollte UserRepository.Save(user) für die Speicherung der Kurse verantwortlich sein.

Dies bedeutet, dass der Benutzer die aggregierte Wurzel der Kursentität ist, aber in Wirklichkeit ist das nicht der Fall, da ich auf viele verschiedene Arten auf den Kurs zugreifen kann und ich nicht vom Benutzerobjekt abhängig bin, um mir den Kurs zu liefern.

Selbst wenn ich einen CourseRegistrationService habe (was ich habe), muss ich ein Repository aufrufen, um die Änderungen beizubehalten. Welches Repository ist für die Persistierung der Änderungen an der Beziehung zwischen Benutzer und Kurs verantwortlich? Vielleicht ein UserCourseRepository!

Außerdem wird User durch das Anlegen einer Liste unter dem User-Objekt zu einem aggregierten Root, oder ist das falsch? Wenn ja, wie würden Sie dann eine Anwendung mit OR MAPPERS entwerfen, die automatisch eine Liste und eine bis viele Beziehungen erzeugt.

4voto

Ben Scheirman Punkte 39742

In DDD-Begriffen sollten Sie an Aggregate und Aggregatwurzeln denken. Gehört einem Benutzer der Kurs? Wahrscheinlich nicht.

Wenn Sie stattdessen so vorgehen, können Sie einen besseren Entwurf erstellen:

Der Benutzer hat viele Registrierungen. Die Registrierung ist mit 1 Kurs verbunden.

Jetzt gibt es kein Viel-zu-Viel mehr. Sie haben ein Objekt erster Klasse, das die Entität User "besitzt".

Die Registrierung wäre ein Wertobjekt (mit UserID, CourseID und vielleicht DateAdded).

Bezüglich der Verwendung von Methoden zu beiden Seiten einer Sammlung hinzufügen, ist dies etwas, das ich auch mit NHibernate tun.

0voto

Justin Niessner Punkte 235353

Ich bin auf eine ähnliche Lösung gestoßen, habe aber einen völlig anderen Ansatz verwendet. Ich fügte Code zu meinen LINQ to SQL-Klassen hinzu, damit sie Many-to-Many-Beziehungen richtig unterstützen. In diesem Blogbeitrag finden Sie die letzten Details:

Mitsu's Blog: Wie man eine Many-to-many-Beziehung mit LINQ to SQL implementiert

Was die Frage betrifft, welches Repository das Hinzufügen eines Schülers zu einer Klasse Natürlich sollte der Name Ihres Dienstes Ihnen einen Hinweis geben ( CourseRegistrationService ). Das Kurs-Repository sollte Studenten zu einer Klasse hinzufügen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X