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