Lorsque j'ai des entités dans mon domaine avec des listes de choses, doivent-elles être exposées en tant que ILists ou IEnumerables? Par exemple, Order a un tas de OrderLines.
Lorsque j'ai des entités dans mon domaine avec des listes de choses, doivent-elles être exposées en tant que ILists ou IEnumerables? Par exemple, Order a un tas de OrderLines.
Réponses:
IEnumerable<T>
représente une série d'éléments sur lesquels vous pouvez parcourir (en utilisant foreach, par exemple), alors que IList<T>
c'est une collection que vous pouvez ajouter ou supprimer.
En règle générale, vous souhaiterez pouvoir modifier une commande en y ajoutant ou en supprimant OrderLines, vous souhaiterez donc probablement que Order.Lines soit un fichier IList<OrderLine>
.
Cela dit, vous devez prendre certaines décisions de conception de cadre. Par exemple, devrait-il être possible d'ajouter la même instance de OrderLine à deux commandes différentes? Probablement pas. Donc, étant donné que vous voudrez être en mesure de valider si une OrderLine doit être ajoutée à la commande, vous pouvez en effet vouloir faire apparaître la propriété Lines comme uniquement un IEnumerable<OrderLine>
, et fournir des méthodes Add (OrderLine) et Remove (OrderLine) qui peuvent gérer cette validation.
IReadOnlyList
ou IReadOnlyCollection
si vous avez besoin que la liste soit matérialisée mais que vous ne voulez pas en ajouter ou en supprimer.
IReadOnlyList
n'a alors aucun sens.
La plupart du temps, je finis par utiliser IList sur IEnumerable car IEnumerable n'a pas la méthode Count et vous ne pouvez pas accéder à la collection via un index (bien que si vous utilisez LINQ, vous pouvez contourner cela avec des méthodes d'extension).
ElementAt
méthode?