Leo*_*rdo 1 architecture domain-driven-design anemic-domain-model
基本上,我的应用程序将像stackoverflow一样工作,你登录和发布的东西,其他人来和互动.
考虑DDD术语,并试图避免贫血模型,我现在面临这样的决定:我的User实体是否应该掌握创建任何更新+删除+检索他的帖子所需的知识,或者我应该回到旧模式我有一个"发布业务服务",将获得UserDTO参考,PostDTO并做一切?
详细信息:
- 我相信我需要某种帖子服务,因为主页面需要列出所有帖子,管理员用户将能够删除任何帖子... -
理想情况下,只有User实体(和其他人继承)从它)应该能够创建帖子
- 我不知道我将如何处理授权(想想阻止垃圾邮件发送者和其他人) -
也许这应该是由User.CreatePost(postDTO)?触发的域名服务?
只是想问出你问题的一部分:
创建任何帖子更新+删除+检索
这表明DDD可能不是这个系统的正确答案.任何核心要求都是创建,读取,更新,删除的系统都没有调用DDD方法.事实上,DDD可能会妨碍您的成功实施 - 一个基本的CRUD系统可能会让您的生活更轻松.
DDD就是你想用域语言来思考的东西 - 用户不是"创建帖子",他们是"提问"或"回答问题".管理员不会"删除帖子"他们"存档帖子".
"提出问题"的技术实现可能最终导致数据库记录变为"已创建",但目标是将其向下推送到持久层,并使域名完全按照"普遍性语言"进行实施.
假设您正在使用DDD,我在考虑这种情况时使用的一种模式是有用的,可以在考虑User问题和答案的核心域时避免使用非常抽象的实体.
一个User实体是罚款的Identity管理界背景下,你在哪里详细跟踪认证/标志.但是,一旦您调查核心域,通常用户就会比一般人更具体和具体,User因为他们在特定角色下与系统互动.例如,您正在考虑提问和回答问题的用户.也许您还有作为管理员的用户或管理员用户.
这些类型的用户中的每一种都将执行不同类型的活动.因此,有时显式地对每个角色进行建模是有帮助的 - 例如Poster实体,Moderator实体和Administrator实体.
你可以有Poster.AskQuestion,Poster.AnswerQuestion,Moderator.Moderate等.
我有时会强调,因为很多时候,用户的角色不需要体现在模型中 - 角色只是访问控制/授权层的一部分,模型可以在当前用户被授权的假设下运行.
例如,您的案例中的关键实体可能是一个MessageBoard有MessageBoard.AddPost方法的实体.
但是,在您的情况下,可能是与帖子相关联的用户是域的核心部分 - 也许您将在用户身上驱动其他行为,作为他们的问题和回答习惯的一部分,例如更改其状态或添加徽章或类似的东西.