Cuando tengo entidades en mi dominio con listas de cosas, ¿deberían estar expuestas como ILists o IEnumerables? Por ejemplo, Order tiene un montón de OrderLines.
Cuando tengo entidades en mi dominio con listas de cosas, ¿deberían estar expuestas como ILists o IEnumerables? Por ejemplo, Order tiene un montón de OrderLines.
Respuestas:
IEnumerable<T>
representa una serie de elementos sobre los que puede iterar (usando foreach, por ejemplo), mientras que IList<T>
es una colección que puede agregar o quitar.
Por lo general, querrá poder modificar un pedido agregando o quitando líneas de pedido, por lo que probablemente desee que Order.Lines sea un IList<OrderLine>
.
Dicho esto, hay algunas decisiones de diseño de marco que debe tomar. Por ejemplo, ¿debería ser posible agregar la misma instancia de OrderLine a dos órdenes diferentes? Probablemente no. Por lo tanto, dado que querrá poder validar si una OrderLine debe agregarse a la orden, es posible que desee mostrar la propiedad Líneas solo como un IEnumerable<OrderLine>
, y proporcionar los métodos Add (OrderLine) y Remove (OrderLine) que pueden manejar esa validación
IReadOnlyList
o IReadOnlyCollection
si necesita que se materialice la lista pero no desea agregarla o eliminarla.
IReadOnlyList
no tiene sentido.
La mayoría de las veces termino con IList sobre IEnumerable porque IEnumerable no tiene el método Count y no puede acceder a la colección a través de un índice (aunque si está utilizando LINQ puede solucionarlo con métodos de extensión).
ElementAt
método?