1

我想知道为我的项目设计域对象的最佳方式是什么。

领域对象应该对 ORM/Framework 甚至数据库技术(MySQL、MSSQL 甚至 Mongo)一无所知

下一个问题出现在脑海中,假设我有两个对象,Post 和 Comment。

这是 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中,帖子和评论之间没有关系,任何帖子都包含评论列表,但评论本身不知道他们所属的帖子。那么,使这些领域类与基于 Sql 的数据库和 NoSql 数据库兼容的最佳方法是什么?

谢谢

4

2 回答 2

1

面向对象设计

你设计你的PostComment类的方式是它们都相互引用。虽然除非绝对必要,否则我会尽量避免这种紧密耦合,但它肯定会Comment.PostId过时,你可以Post.IdComment.

此外,您的域对象可能应该尝试保护它们的不变量。您现在拥有的只是属性包(即使使用公共设置器),而不是域对象,因此目前它们与您用于持久性的对象相比没有任何有意义的优势。

所以如果你想创建一个领域模型,问自己这样的问题:

  • 演员可以对我正在构建的系统中的帖子做什么?
  • 演员可以检索评论中的哪些数据?

然后以支持您的业务案例的方式为您的域对象建模。例如,如果您的应用程序的用户被禁止更改帖子的标题,您应该从Post.Title.

这个答案可能会为您提供有关域对象和简单属性包(又名 POCO)之间区别的更多信息,即使该答案是在域驱动设计的上下文中。

文档数据库持久性

要将这些对象存储在面向文档的数据库中,您基本上有两种选择:

  • 将它们存储为单独的文档并相互参考
  • 将评论作为帖子的一部分存储在帖子文档中

两者都是有效的方法,您必须为您的应用程序做出决定。但是请注意,文档边界也是一致性边界,因此如果您需要对帖子及其评论进行原子操作,您唯一的选择是将它们放在同一个文档上。

于 2015-08-31T08:46:06.080 回答
0

你绝对应该包括它。如果您想获取评论列表但又不想获取每个评论的 Post 对象,但仍需要 PostID,该怎么办?

于 2020-03-18T19:51:23.507 回答