I wanna model Order and Product concept with the help of DDD but I wonder how to deal with it.
Suppose you have Order class that has OrderItem class as it's child and Order is Aggregate Root, and Order class has list of OrderItems and every OrderItem has a reference to Product Class. Product is Aggregate Root of course.
I mean some thing like this :
public class Order{
...
public list<OrderItem> OrderItems {get;set;}
}
public class OrderItems{
...
public int Qty {get; set;}
public Product {get; set;}
}
public class Product{
...
}
but as far as i know I can't have a reference from child of Order Aggregate to Product Aggregate. how to deal with this ?
Tnx in forward.
At the page 202 of book Architecting application for the enterprise you could see an image. There are various bounded context, two of them are really simialr to what you need. Order
is an aggregate root, having Order Detail
as its child. Order Detail
in turn has a relationship with Product
that is the aggegate root of an aggregate in a different bounded context.
So the first thought is that Product
belongs to Order
aggregate.
However, next you might find out that use-case exist to treat products
outside of orders-for example for the catalog of products. This makes
up for another aggergate rooted in Product
.
So... yes, a child of an aggregate can hold a reference to another aggregate root (even in different bounded context).
Is this a right choice? The right answer in a case like that is always: depends.
On what? On business rules, and how you have to handle the aggregate that will be "swallowed" (Product
) by another bigger aggregate (Order
).