Quando ho entità nel mio dominio con elenchi di cose, dovrebbero essere esposte come ILists o IEnumerables? Ad esempio, Order ha un sacco di OrderLines.
Quando ho entità nel mio dominio con elenchi di cose, dovrebbero essere esposte come ILists o IEnumerables? Ad esempio, Order ha un sacco di OrderLines.
Risposte:
IEnumerable<T>
rappresenta una serie di elementi su cui è possibile scorrere (ad esempio utilizzando foreach), mentre IList<T>
è una raccolta che è possibile aggiungere o rimuovere.
In genere vorrai essere in grado di modificare un Ordine aggiungendo o rimuovendo OrderLines ad esso, quindi probabilmente vuoi che Order.Lines sia un IList<OrderLine>
.
Detto questo, ci sono alcune decisioni di progettazione del framework che dovresti prendere. Ad esempio, dovrebbe essere possibile aggiungere la stessa istanza di OrderLine a due ordini diversi? Probabilmente no. Quindi, dato che vorrai essere in grado di convalidare se un OrderLine debba essere aggiunto all'ordine, potresti effettivamente voler mostrare la proprietà Lines come solo un IEnumerable<OrderLine>
, e fornire i metodi Add (OrderLine) e Remove (OrderLine) che possono gestire quella convalida.
IReadOnlyList
o IReadOnlyCollection
se hai bisogno dell'elenco materializzato ma non vuoi aggiungerlo o rimuoverlo.
IReadOnlyList
non ha senso.
Il più delle volte finisco con IList su IEnumerable perché IEnumerable non ha il metodo Count e non puoi accedere alla raccolta tramite un indice (anche se se stai usando LINQ puoi aggirare questo problema con i metodi di estensione).
ElementAt
metodo?