Я пытаюсь представить DDD в новом проекте. Во-первых, меня интересует реализация единицы работы и репозитория для агрегатов без помощи ORM. (Команда решила не использовать Entity Framework из-за его сложности.)
У меня есть один репозиторий на совокупный корень. Предположим, что совокупный корень равен User, он содержит объект Membership и объект-значение Address (остальные игнорируются для простоты).
Все доменные классы не зависят от сохранения, что означает, что они являются простыми классами C# и не имеют никакого метода, который принимает какой-либо параметр (например, его соответствующий репозиторий), связанный с сохранением.
Когда я загружаю экземпляр user из репозитория, я обновляю только поле user.Address. Я думаю о методе единицы работы, который выглядит так:
unit_of_work.Add(user);
....
unit_of_work.Commit();
Я пытаюсь сделать так, чтобы unit_of_work знал, какие свойства в user действительно изменились, и сохранял только их. Но как unit_of_work узнает, что изменено только Address поле, а не остальная часть User агрегата? В этом случае мне нужно, чтобы каждый дочерний объект/значение объекта сам отслеживал изменения. Но если я это сделаю, это противоречит моей первоначальной цели, заключающейся в том, что все доменные классы являются постоянными-агностиками.
У меня есть два неоптимальных решения, которые мне не очень нравятся:
- слепое обновление всей совокупности, игнорируя, какие части изменились, а какие нет.
- сделать глубокую копию всего агрегата, и после
Commitя сравниваю исходный агрегат и его копию и отправляю только изменения.