当我的域中有带有事物列表的实体时,它们应该暴露为 IList 还是 IEnumerables?订单包含一系列的订单行。
IEnumerable<T> 表示可以迭代的一系列项(例如,使用 foreach) ,而 IList<T>是可以添加或删除的集合。
IEnumerable<T>
IList<T>
通常,您希望能够通过向 Order 添加或移除 OrderLines 来修改 Order,因此您可能需要 Order。线条为 IList<OrderLine>。
IList<OrderLine>
话虽如此,您还是应该做出一些框架设计决策。例如,是否可以将同一个 OrderLine 实例添加到两个不同的订单中?也许不会。因此,假设您希望能够验证是否应该将 OrderLine 添加到订单中,那么您可能确实希望仅将 Lines 属性表面化为 IEnumerable<OrderLine>,并提供 Add (OrderLine)和 Remove (OrderLine)方法来处理该验证。
IEnumerable<OrderLine>
大多数情况下,我最终使用 IList 而不是 IEnumable,因为 IEnumable 没有 Count 方法,而且您不能通过索引访问集合(尽管如果您使用 LINQ,您可以通过扩展方法来解决这个问题)。