Domain driven design 服务和存储库领域驱动的设计问题

Domain driven design 服务和存储库领域驱动的设计问题,domain-driven-design,Domain Driven Design,我有两个实体:用户和课程。一个用户可以参加多个课程,使关系成为一对多。但是,一门课程可以被许多学生选修,因此这就形成了多对多的关系 现在,我需要为用户注册一门课程。我的用户实体具有: public void AddCourse(Course course) { if (CoursesAlreadyAdded(course)) { AddBrokenRule(new BrokenRule() { Pr

我有两个实体:用户和课程。一个用户可以参加多个课程,使关系成为一对多。但是,一门课程可以被许多学生选修,因此这就形成了多对多的关系

现在,我需要为用户注册一门课程。我的用户实体具有:

 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到SQL生成的。LINQtoSQL不能执行多对多关系,所以我必须自己处理

现在的问题是如何将信息发送到数据库。UserRepository.Save(用户)是否应负责保存课程

这意味着用户是课程实体的聚合根,但实际上并非如此,因为我可以通过多种不同的方式访问课程,并且我不依赖于用户对象来提供课程

即使我有一个CourseRegistrationService(我有),我也必须调用一个存储库来保存更改。哪个存储库负责保存关于用户和课程关系的更改。也许是一个UserCourseRepository


另外,仅仅通过在用户对象下放置一个列表就可以使用户成为聚合根,或者这是不正确的。如果是这样的话,您将如何使用自动生成列表和一对多关系的或映射器来设计应用程序。

我遇到了类似的解决方案,但使用了完全不同的方法。我向LINQ to SQL类中添加了代码,以便它们正确地支持多对多关系。查看此博客文章以了解最终详细信息:


至于哪个存储库应该处理向班级课程添加学生的问题,您的服务名称应该给您一个提示(
CourseRegistrationService
)。课程库应该将学生添加到一个类中。

用DDD术语来说,您应该考虑聚合和聚合根。用户是否“拥有”课程?可能不会

相反,这样想可能会给你一个更好的设计:

用户有许多注册。 注册与1门课程相关

现在你没有多对多了。您拥有用户实体“拥有”的第一类对象

注册将是一个值对象(具有UserID、CourseID,可能还有DateAdded)


关于使用方法添加到集合的两侧,我对NHibernate也这么做。

听起来数据模型已经设置好了,但在我看来,通过将联接表具体化为注册模型,避免多对多关系,您可以省去一些麻烦。@Thom,不知道你的意思!你能详细说明一下吗!基本上是公认的答案所说的。没有称为类的实体。有用户和课程。用户可以注册课程。此外,是用户有列表,然后我可以只保存用户,它也将坚持课程。编辑删除类。至于你的第二点,同样的事情也可以说关于课程列表。你所要做的就是将学生添加到课程中并保存课程。有点像这样:我打电话注册为UserCourses。我将改为课程注册,因为它更有意义。退房