Quando tenho entidades no meu domínio com listas de coisas, elas devem ser expostas como ILists ou IEnumerables? Por exemplo, Order possui um monte de OrderLines.
Quando tenho entidades no meu domínio com listas de coisas, elas devem ser expostas como ILists ou IEnumerables? Por exemplo, Order possui um monte de OrderLines.
Respostas:
IEnumerable<T>
representa uma série de itens sobre os quais você pode iterar (usando o foreach, por exemplo), enquanto que IList<T>
é uma coleção à qual você pode adicionar ou remover.
Normalmente, você deseja modificar um Pedido adicionando ou removendo OrderLines, e provavelmente deseja que Order.Lines seja um IList<OrderLine>
.
Dito isto, existem algumas decisões de design de estrutura que você deve tomar. Por exemplo, deveria ser possível adicionar a mesma instância do OrderLine a dois pedidos diferentes? Provavelmente não. Portanto, considerando que você deseja validar se um OrderLine deve ser adicionado ao pedido, você pode realmente apresentar a propriedade Lines como apenas um IEnumerable<OrderLine>
e fornecer os métodos Add (OrderLine) e Remove (OrderLine) que podem manipular essa validação.
IReadOnlyList
ou IReadOnlyCollection
se precisar da lista materializada, mas não deseja adicionar ou remover dela.
IReadOnlyList
não faz sentido.
Na maioria das vezes, acabo indo com IList sobre IEnumerable porque IEnumerable não possui o método Count e você não pode acessar a coleção por meio de um índice (embora, se você estiver usando o LINQ, possa contornar isso com métodos de extensão).
ElementAt
método?