IList与IEnumerable的实体集合

当我在我的域名中包含事物列表的实体时,是否应该将它们暴露为IList或IEnumerables? 例如Order有一堆OrderLines。

IEnumerable<T>表示可以迭代的一系列项目(例如,使用foreach),而IList<T>是可以添加或删除的集合。

通常情况下,您希望能够通过添加或删除OrderLines来修改订单,因此您可能希望Order.Lines成为IList<OrderLine>

话虽如此,你应该做一些框架devise的决定。 例如,是否可以将OrderLine的相同实例添加到两个不同的订单中? 可能不会。 因此,假设您希望能够validationOrderLine是否应添加到订单中,您可能确实想要将Lines属性表示为仅一个IEnumerable<OrderLine> ,并提供Add(OrderLine)和Remove(OrderLine)可以处理validation的方法。

大多数情况下,我最终会使用IEnumerable与IList,因为IEnumerable没有Count方法,并且不能通过索引访问集合(尽pipe如果您使用的是LINQ,可以使用扩展方法来解决这个问题)。