Domain driven design DDD:在哪里创建实体对象?
我有三个必须交互的实体:Domain driven design DDD:在哪里创建实体对象?,domain-driven-design,entities,Domain Driven Design,Entities,我有三个必须交互的实体:User、SupportTicket和PhoneConversation。当有人打电话请求帮助时,应为用户分配一张支持票证,并为该票证分配一个电话对话来描述该呼叫 我的问题是:我应该将方法CreatePhoneSupportTicket()放在哪个实体中,该方法创建一个新的SupportTicket和一个PhoneConversation,将它们相互关联,最后将SupportTicket与用户关联 我猜它不可能在用户身上,因为这会违反SRP(用户会做更多的事情)。但是这个
User
、SupportTicket
和PhoneConversation
。当有人打电话请求帮助时,应为用户分配一张支持票证,并为该票证分配一个电话对话来描述该呼叫
我的问题是:我应该将方法CreatePhoneSupportTicket()
放在哪个实体中,该方法创建一个新的SupportTicket和一个PhoneConversation,将它们相互关联,最后将SupportTicket与用户关联
我猜它不可能在用户身上,因为这会违反SRP(用户会做更多的事情)。但是这个方法本身做的不止一件事,它应该创建一个SupportTicket和一个PhoneConversation。在这种情况下,服务比将方法放在实体上更好吗?谢谢你的帮助 如果不熟悉您的域,很难说,但是拥有
AsupportTicketPository.CreatePhoneSupportTicket(aUser,aPhoneConversation)
对于某些实体来说,支持这样的方法可能是有意义的,但是没有什么可以阻止您在幕后调用服务
在这种情况下,分析(你可能已经做过)似乎是为了看看我们知道什么以及什么时候知道。例如,呼叫进入时,您可能可以使用呼叫者ID来识别用户。如果你以前见过他,给他装子弹。如果没有,创建一个新的。无论哪种情况,您都是从用户开始的
同时,这是一个新的调用,所以创建一个,也许是一个工厂
如果是现有用户,这是现有票证的延续吗?如果是,找到它并添加此呼叫。做这样的事情可能很方便
Ticket t = user.GetOpenTicket();
t.AddCall(currentCall);
不管怎样。但是,对于Ticket.AddCall和user.GetOpenTicket调用到服务中来完成繁重的工作可能是最有意义的。如果新的操作符符合您的逻辑,那么使用它没有什么错。如果只有一种SupportTicket,请使用
新建SupportTicket(currentUser)
创建一种。或者,如果依赖关系是另一种方式,则向用户添加一个CreateSupportTicket()
方法,并在那里调用new SupportTicket()
。SupportTicket构造函数可以依次创建新的PhoneConversation()
。如果您后来决定应该使用某种工厂,您可以随时重构代码。但在此之前,请使用您能想象到的最简单的解决方案。在本例中,我建议将此方法置于
那么…域服务是…什么?好,
如果实体和值对象是
“事物”在我们的领域,服务
是一种处理行动的方式,
业务和活动。不应该
逻辑是否直接在实体上?
是的,确实应该。我们应该
用逻辑为实体建模
这与他们和他们的家人有关
儿童但有时这种逻辑
要么不适合实体,要么
这将使实体膨胀和膨胀
笨手笨脚的这就是服务到来的时候
进入画面。他们帮助我们分裂
处理多重逻辑的逻辑
实体,或处理复杂问题的实体
操作或外部
责任,分为单独的
结构更适合任务。结构更适合任务
从第19页开始,我建议使用一个工厂来创建一个支持票证,支持票证创建在其中实例化一个电话对话