关于服务和存储库的域驱动设计问题

时间:2010-01-26 20:50:44

标签: domain-driven-design

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

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

 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(用户)是否应负责保存课程。

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

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

另外,只需在User对象下放置一个List就可以使User成为聚合根或者是不正确的。如果是这样,那么如何使用OR MAPPERS设计应用程序,它自动生成List和一对多关系。

2 个答案:

答案 0 :(得分:4)

在DDD术语中,您应该考虑聚合和聚合根。用户“拥有”课程吗?可能不是。

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

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

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

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

关于使用方法添加到集合的两边,这也是我对NHibernate所做的事情。

答案 1 :(得分:0)

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

Mitsu's blog: How to implement a many-to-many relationship using LINQ to SQL

至于哪个存储库应该处理将学生添加到 Class 课程,您的服务名称应该给你一个提示(CourseRegistrationService)。课程库应该是将学生添加到课程中。