Вопрос по управляемому доменом вопросу об услугах и репозиториях - PullRequest
3 голосов
/ 26 января 2010

У меня есть две сущности: Пользователь и Курс. Пользователь может пройти несколько курсов, что делает отношения один ко многим. Но многие студенты могут пройти один курс, так что это делает их отношениями со многими.

Теперь мне нужно зарегистрировать курс для пользователя. Мой пользовательский объект имеет:

 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});
        }

Классы создаются через Linq to SQL. Linq to sql не способен выполнять многие отношения, поэтому я должен справиться с этим сам.

Теперь вопрос в том, как я отправлю информацию в базу данных. Должен ли UserRepository.Save (пользователь) отвечать за сохранение курсов.

Этот тип означает, что Пользователь является совокупным корнем сущности Курса, но на самом деле это не так, поскольку я могу получить доступ к Курсу многими различными способами, и я не зависим от объекта Пользователь, чтобы предоставить мне Курс.

Даже если у меня есть служба CourseRegistrationService (которая у меня есть), я должен вызвать хранилище, чтобы сохранить изменения. Какой репозиторий отвечает за сохранение изменений в отношении пользователя и курса. Может быть, UserCourseRepository !!

Кроме того, просто поместив список под объектом «Пользователь», пользователь становится совокупным корнем или это неверно. Если да, то как бы вы разработали приложение, используя OR MAPPERS, который автоматически генерирует список и отношения один ко многим.

Ответы [ 2 ]

4 голосов
/ 27 января 2010

В терминах DDD вы должны думать о агрегатах и ​​корнях агрегатов. Пользователь "владеет" курсом? Вероятно, нет.

Вместо этого, думая об этом, вы получите лучший дизайн:

У пользователя много регистраций. Регистрация связана с 1 курсом.

Теперь у вас не много ко многим. У вас есть объект первого класса, который «принадлежит» сущности User.

Регистрация будет представлять собой объект значения (который имеет UserID, CourseID и, возможно, DateAdded).

Что касается использования методов для добавления к обеим сторонам коллекции, это то же, что я делаю и с NHibernate.

0 голосов
/ 26 января 2010

Я столкнулся с подобным решением, но использовал совершенно другой подход. Я добавил код в классы LINQ to SQL, чтобы они правильно поддерживали отношения «многие ко многим». Проверьте это сообщение в блоге для окончательных деталей:

Блог Mitsu: Как реализовать отношение «многие ко многим» с помощью LINQ to SQL

Что касается того, какой репозиторий должен обрабатывать добавление ученика в курс Class , название вашей службы должно указывать вам подсказку (CourseRegistrationService). Хранилище курса должно добавлять учеников в класс.

...