Какой подход рекомендуется в мире DDD... и почему?
aggregateRoot.Items.Add(...)
aggregateRoot.AddItem(...)
Я думаю, что первый вариант лучше, поскольку он больше связан с вездесущим языком.
Должен ли я открывать сборку только для чтения (IEnumerable) и некоторые AddItem()/RemoveItem()/etc в aggregateRoot (вариант 1) или выставлять строго типизированную коллекцию (мне не нравится выставлять IList <T> или даже хуже, List <T> ), который поддерживает добавление/удаление/etc (вариант 2).
Оба имеют свои возможности в зависимости от того, какой API-интерфейс вы хотите представить своему пользователю.
Если вы инкапсулируете коллекцию, в которой вы не хотите, чтобы пользователи обращались напрямую, вы можете использовать AddItem() как довольно самоустанавливаемый метод, чтобы помочь пользователям добавлять элемент к нему.
Если ваш объект предоставляет коллекцию как есть, то Items.Add() является последовательным поведением коллекции и, вероятно, будет лучшим выбором.