Nel tentativo di salvare questa domanda, l'ho riscritta. La domanda originale riguardava come associare le radici aggregate. Ho rielaborato leggermente il codice ma credo che questo possa accoppiare il codice troppo strettamente.
Introduco troppo stretto l'accoppiamento facendo passare le radici aggregate? Ad esempio:
class Order
{
public Order(int customerId, Address billing, Address shipping, List<Items> items)
{
_customerId = customerId;
_billing = billing;
_shipping = shipping
_items = items;
}
private int _id;
private Address _billing;
private Address _shipping;
private List<Item> _items;
}
class Customer
{
public Order PlaceOrder(List<Item> items)
{
return new Order(_id, _billingAddress, _shippingAddress, items);
}
private int _id;
}
class Cart
{
public Order Checkout(Customer customer)
{
var items = _items.ToList();
_items.Clear();
return customer.PlaceOrder(_items.ToList());
}
public AddItem(Product product, int quantity)
{
// Add item to cart
}
public RemoveItem(Product product, int quantity)
{
// Remove item from cart
}
private List<Item> _items = new List<Item>();
}
Quindi nel mio livello di servizio applicativo per un cliente per il checkout avrei qualcosa del tipo:
public CustomerCheckoutService
{
public void Checkout(int customerId)
{
var customer = _customerRepo.GetById(customerId);
CompletePurchase(customer);
}
public void Checkout(int customerId, Address newShipping)
{
var customer = _customerRepo.GetById(customerId);
customer.UpdateShipping(newShipping);
CompletePurchase(customer);
}
private void MakePurchase(Customer customer)
{
var cart = _cartRepo.GetByCustomer(customerId);
var order = cart.Checkout(customer);
_orderRepo.Save(order);
_cartRepo.Save(cart);
}
}
Mi sembra che ci sia un sacco di accoppiamenti tra i miei aggregati e ognuno di loro ha bisogno l'uno dell'altro.