Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DDD: Where to create entity objects?

I have three entities that must interact: User, SupportTicketand PhoneConversation. When someone calls in requesting help, the User should have a SupportTicket assigned to him, with a PhoneConversation assigned to the Ticked describing the call.

My question is: In what entity should I put the method CreatePhoneSupportTicket() that creates a new SupportTicket and a PhoneConversation, relates them to each other and finally relates the SupportTicket to the User?

I'm guessing it can't be on the user because that would violate the SRP (the user does a few more things). But the method itself does more than one thing, it should create both a SupportTicket and a PhoneConversation. Is this a situation when a Service is a better solution then putting methods on entities? Thanks for your help!

like image 357
ciscoheat Avatar asked Jun 08 '10 19:06

ciscoheat


2 Answers

There's nothing wrong with using the new operator if it fits the rest of your logic. If there is only one kind of SupportTicket, use new SupportTicket(currentUser) to create one. Or, if the dependency is the other way, add a CreateSupportTicket() method to User and call new SupportTicket() there. The SupportTicket constructor in turn can create a new PhoneConversation(). If you decide later that you should have used some kind of factory, you can always refactor your code. But until then, go for the simplest solution you can imagine.

like image 71
Malte Clasen Avatar answered Oct 06 '22 02:10

Malte Clasen


In this case i will recomend putting this method in a Domain Service

So … Domain Services Are … What? Well, if Entities and Value Objects are the “things” in our Domain, the Services are a way of dealing with actions, operations and activities. Shouldn’t Logic Be on the Entities Directly? Yes, it really should. We should be modelling our Entities with the logic that relates to them and their children. But sometimes that logic either doesn’t fit on the Entity, or it would make the Entity bloated and unwieldy. That is when Services come into the picture. They help us split logic that deals with multiple Entities, or that deals with complex operations or external responsibilities, into a separate structure more suited to the task.structure more suited to the task.

From Domain Driven Design Step by Step (Free E-book) Page #19

like image 37
Amr Elgarhy Avatar answered Oct 06 '22 01:10

Amr Elgarhy