【问题标题】:Domain Driven Design Question on Services and Repositories关于服务和存储库的领域驱动设计问题
【发布时间】:2010-01-26 20:50:44
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 听起来数据模型已经设置好了,但在我看来,通过将连接表具体化为注册模型来避免多对多关系,您可以省去一些麻烦。
  • @Thom,不知道你的意思!能详细点吗!
  • 基本上是接受的答案所说的。

标签: domain-driven-design


【解决方案1】:

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

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

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

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

Registration 将是一个值对象(具有 UserID、CourseID 和可能的 DateAdded)。

关于使用方法添加到集合的两侧,这是我在 NHibernate 中所做的事情。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 没有称为类的实体。有用户和课程。用户可以注册课程。另外,如果用户有 List 那么我可以保存用户,它也会保留课程。
    • 编辑删除类。至于您的第二点,对于 List for Course 也可以这样说。您所要做的就是将学生添加到课程并保存课程。
    • 有点像这样:我将注册称为用户课程。我将更改为 CourseRegistrations,因为它更有意义。查看pastie.org/795679
    猜你喜欢
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多