Referenziamento entità all'interno di aggregati per ID locale

0

Come si fa correttamente riferimento a un'entità all'interno di un aggregato? Ad esempio, dall'indice di un elenco (non sembra intelligente se si ordina nuovamente l'elenco); un GUID (pensato che doveva essere locale?); o qualche altro contatore incrementale?

Ad esempio:

class Cart
{
  public IReadOnlyList<Item> Items => _items.ToList();

  public AddItem(Item item)
  {
  }

  public RemoveItem(/* Item or ItemId or index (int)? */) <- Here
  {
    _items.Remove(xxxxx); // <- And here
  }

  private readonly List<Item> _items = new List<Item>(); // Maybe need different data structure
}

class Item
{
  // Local identity here? 

  public int Quantity { get; private set; }

  public Item(Product product)
  {
    // use product properties needed
  }

  // other item properties
}

Sembra errato che un client debba restituire un List<Item> da Cart per poi utilizzare l'indice per rimuovere l'elemento. Inoltre, se istanzio l'elemento al di fuori della classe prima di aggiungerlo, come impongo un ID locale (avrei un GUID se l'istanziazione all'esterno)?

TL; DR come trattare con le identità locali delle entità (ad esempio, come locale è "locale")?

    
posta keelerjr12 14.11.2018 - 19:42
fonte

1 risposta

1

Un client non aggiunge o elimina Item a / da Cart . Un client comanda Cart per aggiungere / rimuovere Product (VO) e quantity . È solo un Item una volta che è in Cart . Ha senso? Consentire a un client di mantenere un riferimento a Item potrebbe potenzialmente interrompere gli invarianti nel caso in cui modifichi Item dall'esterno di Cart aggregato.

In termini di come Cart tiene traccia di ogni Item , dipende da te. Non pensarci troppo. Concentrati sul comportamento che vorresti ottenere e lascia che i dati che lo consentono siano un dettaglio di implementazione. Non è davvero importante come siano organizzati i meccanismi interni di Cart . Se vuoi usare un GUID o un contatore, fallo e basta. Non preoccuparti di cosa "sembra" giusto. Forse non hai nemmeno bisogno di un List<Item> . Esistono altri modi per organizzare i dati.

So che probabilmente non è quello che vuoi sentire, ma offrire una soluzione specifica significherebbe portare il focus di questa discussione sui dati del tuo sistema invece del suo comportamento. Questo non è il modo DDD.

    
risposta data 14.11.2018 - 21:07
fonte

Leggi altre domande sui tag