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页开始,我建议使用一个工厂来创建一个支持票证,支持票证创建在其中实例化一个电话对话