web-dev-qa-db-ja.com

エンティティのコレクションのIListとIEnumerable

ドメインに物のリストを持つエンティティがある場合、それらをIListsまたはIEnumerableとして公開する必要がありますか?例えば。注文には多数のOrderLineがあります。

145
pondermatic

IEnumerable<T> は(foreachなどを使用して)繰り返し処理できる一連のアイテムを表しますが、 IList<T> は追加可能なコレクションですからまたは削除します。

通常、OrderLinesを追加または削除してOrderを変更できるようにしたいので、おそらくOrder.LinesをIList<OrderLine>にする必要があります。

そうは言っても、フレームワークの設計上の決定事項がいくつかあります。たとえば、OrderLineの同じインスタンスを2つの異なる注文に追加することは可能でしょうか?おそらくない。 OrderLineを注文に追加する必要があるかどうかを検証できるようにするには、LinesプロパティをIEnumerable<OrderLine>のみとして表示し、Add(OrderLine)およびRemove(OrderLine )その検証を処理できるメソッド。

182
Matt Hamilton

ほとんどの場合、IEnumerableにはCountメソッドがなく、インデックスを介してコレクションにアクセスできないため、IEnumerableではなくIListを使用することになります(ただし、LINQを使用している場合は、拡張メソッドでこれを回避できます)。

24
JoshSchlesinger