Это действительно хороший вопрос - и кое-что, что я осознал, пытаясь использовать ORM для доменных объектов. Мои доменные объекты предоставляют открытые свойства типа IEnumerable, которые возвращают ReadOnlyCollection, поэтому единственный способ добавить в коллекцию - вызвать пользовательский метод Add для родительского объекта.
На мой взгляд, нет, вы не слишком далеко зашли для создания своих предметов таким образом.
Я полностью оправдываю попытки максимально инкапсулировать ваши объекты, сохраняя поля закрытыми и предоставляя открытые методы, которые являются атомарными, явно показывают намерение и гарантируют, что объекты могут существовать только в допустимом состоянии. Если это означает использование сырого ADO.NET, пусть будет так. На мой взгляд, сохранение доменных объектов в строгом дизайне не должно быть скомпрометировано выбором технологии DAL.
Однако, я НЕНАВИЖУ, пишу код DAL котельной плиты и пишу сырой ADO.NET с sprocs в мои дни. Я пришел к выводу, что написание DAL для инкапсулированных доменных объектов становится НАМНОГО, НАМНОГО проще, если вы используете Event Sourcing в качестве механизма сохранения для своих доменных объектов. Все, что вам нужно, это таблица событий, в которой все ваши события хранятся в виде сериализованных данных. Поскольку сами доменные объекты не сохраняются, не имеет значения, что репозитории не имеют доступа к свойству List объекта домена. Затем ваша единица работы «вызывает» эти события, которые может обрабатывать компонент запроса, что будет заполнять / обновлять любые таблицы, которые вам нужны, используя простые DTO и ORM.
Вот пример источника событий
CQRS & Event Sourcing фактически разработан для обеспечения высокой масштабируемости и по определению включает в себя множество асинхронных операций, основанных на «в конечном итоге непротиворечивой» парадигме. Однако даже при работе над проектами, не требующими такого уровня масштабируемости, я обнаружил, что синхронное следование этим шаблонам обеспечивает механизм для полной инкапсуляции моих доменных объектов, при этом не нужно писать ни одной строки кода DAL, созданного вручную экономя огромное количество времени и предоставляя полный контрольный журнал (события) для каждого когда-либо предпринятого действия, добавляемого бесплатно. Это также бесценный инструмент, если вашей системе необходимо обмениваться данными со сторонними системами посредством обмена сообщениями.