实体集合的 IList 与 IEnumable

当我的域中有带有事物列表的实体时,它们应该暴露为 IList 还是 IEnumerables?订单包含一系列的订单行。

55268 次浏览

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

通常,您希望能够通过向 Order 添加或移除 OrderLines 来修改 Order,因此您可能需要 Order。线条为 IList<OrderLine>

话虽如此,您还是应该做出一些框架设计决策。例如,是否可以将同一个 OrderLine 实例添加到两个不同的订单中?也许不会。因此,假设您希望能够验证是否应该将 OrderLine 添加到订单中,那么您可能确实希望仅将 Lines 属性表面化为 IEnumerable<OrderLine>,并提供 Add (OrderLine)和 Remove (OrderLine)方法来处理该验证。

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