域对象中的关系引用 - 是否包含 Id?
Relational Reference in Domain Objects - Include Id or Not?
我想知道为我的项目设计域对象的最佳方法是什么。
领域对象应该对ORM/Framework甚至数据库技术一无所知(MySQL、MSSQL,甚至Mongo)
下一个问题出现了,假设我有两个对象,Post 和评论。
这是 Post 对象的代码:
class Post {
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public IList<Comment> Comments { get; set; }
}
现在,我对 Comment 对象的问题是它应该包含一个 Post ID 还是只包含一个 Post 对象?
class Comment {
public int Id { get; set; }
public string Content { get; set; }
public Post Post { get; set; }
public int PostId { get; set; } // Should i include it?
}
包含关系对象的 Id 还是仅包含其域对象是一种好的做法吗?
另一个问题是没有像 mongodb 这样的 sql 数据库。
如果我将数据存储在 mongodb 中,Comment 对象将引用什么 Post 对象?
在 mongodb 中,post 和评论之间没有任何关系,任何 post 都包含评论列表,但评论本身并不知道它们所属的 post。
那么,使这些域 类 与基于 Sql 的数据库和非 Sql 数据库兼容的最佳方法是什么?
谢谢
Object-oriented设计
您设计 Post
和 Comment
类 的方式使它们相互引用。虽然除非绝对必要,否则我会尽量避免这种紧密耦合,但它肯定会使 Comment.PostId
过时,您可以从 Comment
中调用 Post.Id
。
此外,您的域 objects 可能应该尝试保护它们的不变量。你现在拥有的只是 属性 包(即使有 public setters),而不是域 objects,所以目前它们没有提供任何比 objects 你会用它来保持持久性。
因此,如果您想创建领域模型,请问自己以下问题:
- 演员可以用我正在构建的系统中的 post 做什么?
- 演员可以检索哪些评论数据?
然后以支持您的业务案例的方式为您的领域建模objects。例如,如果您的应用程序的用户被禁止更改 post 的标题,您应该从 Post.Title
.
中删除 setter
This answer 可能会为您提供有关域 objects 和简单 属性 包(又名 POCO)之间区别的更多信息,即使该答案是在 [=35 的上下文中=]domain-driven设计.
文档数据库持久性
要将这些 objects 存储在 document-oriented 数据库中,您基本上有两种选择:
- 将它们存储为单独的文档并相互引用
- 将评论作为 post 的一部分存储在 post 文档中
两者都是有效的方法,你必须为你的应用程序做出决定。但是请注意,文档边界也是一致性边界,因此如果您需要对 post 及其注释进行原子操作,您唯一的选择是将它们放在同一个文档中。
绝对应该包含它。如果您想获取评论列表但不想获取每个评论的 Post 对象,但仍然需要 PostID,该怎么办?
我想知道为我的项目设计域对象的最佳方法是什么。
领域对象应该对ORM/Framework甚至数据库技术一无所知(MySQL、MSSQL,甚至Mongo)
下一个问题出现了,假设我有两个对象,Post 和评论。
这是 Post 对象的代码:
class Post {
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public IList<Comment> Comments { get; set; }
}
现在,我对 Comment 对象的问题是它应该包含一个 Post ID 还是只包含一个 Post 对象?
class Comment {
public int Id { get; set; }
public string Content { get; set; }
public Post Post { get; set; }
public int PostId { get; set; } // Should i include it?
}
包含关系对象的 Id 还是仅包含其域对象是一种好的做法吗?
另一个问题是没有像 mongodb 这样的 sql 数据库。 如果我将数据存储在 mongodb 中,Comment 对象将引用什么 Post 对象? 在 mongodb 中,post 和评论之间没有任何关系,任何 post 都包含评论列表,但评论本身并不知道它们所属的 post。 那么,使这些域 类 与基于 Sql 的数据库和非 Sql 数据库兼容的最佳方法是什么?
谢谢
Object-oriented设计
您设计 Post
和 Comment
类 的方式使它们相互引用。虽然除非绝对必要,否则我会尽量避免这种紧密耦合,但它肯定会使 Comment.PostId
过时,您可以从 Comment
中调用 Post.Id
。
此外,您的域 objects 可能应该尝试保护它们的不变量。你现在拥有的只是 属性 包(即使有 public setters),而不是域 objects,所以目前它们没有提供任何比 objects 你会用它来保持持久性。
因此,如果您想创建领域模型,请问自己以下问题:
- 演员可以用我正在构建的系统中的 post 做什么?
- 演员可以检索哪些评论数据?
然后以支持您的业务案例的方式为您的领域建模objects。例如,如果您的应用程序的用户被禁止更改 post 的标题,您应该从 Post.Title
.
This answer 可能会为您提供有关域 objects 和简单 属性 包(又名 POCO)之间区别的更多信息,即使该答案是在 [=35 的上下文中=]domain-driven设计.
文档数据库持久性
要将这些 objects 存储在 document-oriented 数据库中,您基本上有两种选择:
- 将它们存储为单独的文档并相互引用
- 将评论作为 post 的一部分存储在 post 文档中
两者都是有效的方法,你必须为你的应用程序做出决定。但是请注意,文档边界也是一致性边界,因此如果您需要对 post 及其注释进行原子操作,您唯一的选择是将它们放在同一个文档中。
绝对应该包含它。如果您想获取评论列表但不想获取每个评论的 Post 对象,但仍然需要 PostID,该怎么办?