Если в моем домене есть объекты со списками вещей, должны ли они быть представлены как ILists или IEnumerables? Например, в Order есть несколько строк OrderLines.
Если в моем домене есть объекты со списками вещей, должны ли они быть представлены как ILists или IEnumerables? Например, в Order есть несколько строк OrderLines.
Ответы:
IEnumerable<T>
представляет серию элементов, которые вы можете перебирать (например, с помощью foreach), тогда IList<T>
как это коллекция, которую вы можете добавлять или удалять.
Как правило, вы хотите иметь возможность изменять Order, добавляя или удаляя к нему OrderLines, так что вы, вероятно, хотите, чтобы Order.Lines были IList<OrderLine>
.
Сказав это, есть некоторые решения по проектированию рамок, которые вы должны принять. Например, можно ли добавить один и тот же экземпляр OrderLine в два разных заказа? Возможно нет. Таким образом, учитывая, что вы захотите проверить, следует ли добавлять OrderLine в заказ, вы действительно можете IEnumerable<OrderLine>
отобразить свойство Lines только как и предоставить методы Add (OrderLine) и Remove (OrderLine), которые могут обрабатывать эта проверка.
IReadOnlyList
или, IReadOnlyCollection
если вам нужен материализованный список, но вы не хотите добавлять или удалять его.
IReadOnlyList
нет смысла.
Большую часть времени я заканчиваю тем, что использую IList вместо IEnumerable, потому что IEnumerable не имеет метода Count, и вы не можете получить доступ к коллекции через индекс (хотя, если вы используете LINQ, вы можете обойти это с помощью методов расширения).
ElementAt
метода?