Изменения документа Мнение
Редактировал(а) Alexandr Fokin 2026/09/15 13:34
От версии 1.1
отредактировано Alexandr Fokin
на 2026/09/15 12:45
на 2026/09/15 12:45
Изменить комментарий:
К данной версии нет комментариев
К версии 1.7
отредактировано Alexandr Fokin
на 2026/09/15 13:22
на 2026/09/15 13:22
Изменить комментарий:
К данной версии нет комментариев
Сводка
-
Свойства страницы (1 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Содержимое
-
... ... @@ -1,0 +1,54 @@ 1 +|= |= |= 2 +| |((( 3 +Мнение автора: на основании своего опыта я выступаю скорее за анемичную модель: когда сущность в основном контейнер для данных, почти не содержащий логику, и наборе команд/сервисов для взаимодействия с ними (и именно на команды ложиться ответственность за сохранение консистентности агрегатов). 4 +\\Для меня вполне допустим следующий вариант: в доменной логике мы не создаем и не редактируем сущности напрямую, а делаем это через ISetter компонент. В контракт конкретного ISetter мы закладываем способы создания и изменения сущности. В таком случае у нас есть компонент, который указывает на контракт и допустимые способы взаимодействия с конкретной сущностью. 5 + 6 +Пример поведения, располагаемого в ISetter: 7 + 8 +1. типизированные билдеры под конкретные сценарии использования (инварианты) 9 +1. взаимодействие со связанными сущностями (родительская-дочерняя) (добавление, смена родительской сущности) 10 +1. вычисляемые свойства (которые меняются при изменении полей). 11 + 12 +У этого подхода еще есть плюс, связанный с [[Expression tree ~| Деревья выражений>>doc:Разработка.NET.C#.Рантайм и типы.Expression tree | Деревья выражений.WebHome]]. А именно мы легко можем строить Expression (например для проекции или Update запроса) (открытые setter). 13 +)))| 14 +| |((( 15 +|{{code language="c#"}}// Entity rules (interaction interface) 16 +interface IEntityServices<TEntity> 17 +{ 18 + // Set rules (single point of editing). 19 + ITEntitySetter Setter { get; } 20 + 21 + // Specification rules 22 + ITEntityConditions Conditions { get; } 23 + 24 + // Discrimination union (OneOf) for invariants. 25 + ITEntityOneOf { get; } 26 +}{{/code}}|{{code language="c#"}}interface ITEntitySetter 27 +{ 28 + TEntity Create1(Create1Param parameters); 29 + TEntity Create2(Create2Param parameters); 30 + 31 + void SetProperty1(TEntity entity, TValue propertyValue); 32 + 33 + void SetProperty2(TEntity entity, Property2Param parameters); 34 +} 35 + 36 +interface ITEntityCondition 37 +{ 38 + bool IsCondition1(TEntity entity); 39 + 40 + bool IsCondition2(TEntity entity, Conditition2Params params); 41 +} 42 + 43 +interface ITEntityOneOf 44 +{ 45 + void PropertyOneOf( 46 + TEntity entity, 47 + Action<TInvariant1Dto> invariant1Handler, 48 + Action<TInvariant2Dto> invariant2Handler) 49 +}{{/code}} 50 + 51 + 52 +)))|[[Specification>>doc:Архитектура и модели.Группа\. Архитектурные подходы.DDD | Domain-driven design.Specification.WebHome]] 53 + 54 +