Исходный код вики Мнение

Редактировал(а) Alexandr Fokin 2026/09/15 13:34

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