- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的域的简要说明:
我的文章基本上和任何文章一样(标题、摘要和正文)。
我需要允许对我的文章进行投票,投票将由匿名用户投票(无需注册,但 session 会存储投票,请不要关注这一点)。
在这个域中,文章是我的聚合根。
我找不到满足以下要求的选票建模方法:
投票可以是我喜欢或不喜欢,它应该是可变的(它可以随着时间的推移而改变甚至取消)
具有关联 session 的访客用户只能为每篇文章投一票。
那么,Vote 是否应该单独聚合?
就像是
Class Vote {
public function cast(ArticleId id, GuestSessionToken token, VoteValue value);
}
但在这种情况下,我应该如何检查唯一性?使用最终一致性(这似乎没问题,因为我没有一些重复,因为它们很少见)。
因为如果我将投票方法添加到我的文章聚合中,我将不得不为每篇投票重播历史,这听起来很慢(考虑到我每篇文章可以有 10 万票)。
我知道在设计 DDD 方式时不应该考虑性能和优化,但这里是我在实现任何东西之前需要解决的一个特定问题。
你们中有人做过类似的事情吗?
最佳答案
投票本身就是一个聚合根。如果我们考虑关联“一篇文章有很多票”,那么我们正在应用一种关系方法,这使我们倾向于 DDD 社区同意的如此批评的大聚合方法。相反,我们希望关注行为。我们已经知道,文章不会持有投票集合。由于投票需要自己的生命周期,因此它将拥有自己的全局身份和自己的存储库。一篇文章是由用户投票的,这是给我们的领域模型提供语义的一种很好的方法,所以玩领域专家语义我们可以说“一篇文章是由用户投票的”
anArticle.votedBy(aReader);
Article.votedBy(aReader) {
return new Vote(this, aReader);
}
RestInterface.voteArticle(articleId) {
reader = new Reader(articleRepository);
reader.vote(articleId);
}
Reader.vote(anArticleId) {
article = articleRepository.get(anArticleId);
vote = article.votedBy(this);
voteRepository.add(vote);
}
Article.likedBy(aReader) {
return Vote.positiveByOn(aReader, this);
}
Article.dislikedBy(aReader) {
return Vote.negativeByOn(aReader, this);
}
class Vote {
readerId
articleId
typeId
Vote(aReaderId, anArticleId, aType) {
readerId = aReaderId
articleId = anArticleId
type = aType
}
public Enum VoteType { POSITIVE, NEGATIVE }
Vote static positiveByOn(aReader, anArticle) {
return new Vote(aReader.id, anArticle.id, POSITIVE);
}
Vote static negativeByOn(aReader, anArticle) {
return new Vote(aReader.id, anArticle.id, NEGATIVE);
}
}
关于architecture - 如何在 DDD/CQRS/EventSourced 项目中建模投票/点赞系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27058509/
我是一名优秀的程序员,十分优秀!