7

我有三个必须交互的实体:User和。当有人打电话请求帮助时,用户应该有一个 SupportTicket 分配给他,一个 PhoneConversation 分配给 Ticked 描述呼叫。SupportTicketPhoneConversation

我的问题是:我应该将CreatePhoneSupportTicket()创建新 SupportTicket 和 PhoneConversation 的方法放在哪个实体中,将它们相互关联并最终将 SupportTicket 与用户关联?

我猜它不能在用户身上,因为这会违反 SRP(用户做更多的事情)。但该方法本身不止做一件事,它应该同时创建 SupportTicketPhoneConversation。当服务是更好的解决方案然后将方法放在实体上时,这是一种情况吗?谢谢你的帮助!

4

5 回答 5

5

如果 new 运算符符合您的其余逻辑,则使用它没有任何问题。如果只有一种 SupportTicket,请使用new SupportTicket(currentUser)创建一种。或者,如果依赖项是另一种方式,则CreateSupportTicket()向 User 添加一个方法并new SupportTicket()在那里调用。SupportTicket 构造函数反过来可以创建一个new PhoneConversation(). 如果您稍后决定应该使用某种工厂,您可以随时重构您的代码。但在那之前,请选择您能想象到的最简单的解决方案。

于 2010-06-08T19:26:07.427 回答
2

在这种情况下,我建议将此方法放在域服务中

所以……域服务是……什么?好吧,如果实体和值对象是我们领域中的“事物”,那么服务就是处理动作、操作和活动的一种方式。逻辑不应该直接在实体上吗?是的,确实应该。我们应该使用与实体及其孩子相关的逻辑来建模我们的实体。但有时这种逻辑要么不适合实体,要么会使实体臃肿且笨拙。这就是服务出现的时候。它们帮助我们将处理多个实体或处理复杂操作或外部职责的逻辑拆分为更适合任务的单独结构。结构更适合任务。

领域驱动设计一步一步(免费电子书)第 19 页

于 2010-07-08T01:31:47.877 回答
2

我建议使用工厂来创建支持票,支持票创建会在其中实例化电话对话。

于 2011-01-19T16:15:37.943 回答
0

某些实体支持这样的方法可能是有意义的,但没有什么可以阻止您在幕后调用服务。

在这种情况下,分析(您可能已经完成)似乎是为了了解我们知道什么以及何时知道。例如,来电,因此您可以使用 caller-ID 来识别用户。如果您以前见过他,请加载他。如果没有,请创建一个新的。无论哪种情况,您都是从用户开始的。

同时,这是一个新的调用,所以创建一个,也许是一个工厂?

如果是现有用户,这是现有票证的延续吗?如果是这样,找到它并添加这个调用。做类似的事情可能很方便

Ticket t = user.GetOpenTicket();
t.AddCall(currentCall);

任何。但是对于 Ticket.AddCall 和 user.GetOpenTicket 调用服务来完成繁重的工作,这可能是最有意义的。

于 2010-06-08T19:13:41.233 回答
-2

如果没有对您的领域有深入的了解,很难说,但是拥有它是否有意义aSupportTicketRepository.CreatePhoneSupportTicket(aUser, aPhoneConversation)

于 2010-06-08T19:12:49.123 回答