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.
collections
ienumerable
ilist
pondermatique
la source
la source
Réponses:
IEnumerable<T>
représente une série d'éléments sur lesquels vous pouvez parcourir (en utilisant foreach, par exemple), alors queIList<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.la source
IReadOnlyList
ouIReadOnlyCollection
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).
la source
ElementAt
méthode?