Изменения документа Мнение

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

От версии 1.2
отредактировано Alexandr Fokin
на 2026/09/15 12:49
Изменить комментарий: К данной версии нет комментариев
К версии 1.6
отредактировано Alexandr Fokin
на 2026/09/15 13:22
Изменить комментарий: К данной версии нет комментариев

Сводка

Подробности

Свойства страницы
Содержимое
... ... @@ -1,13 +1,19 @@
1 -|= |=
1 +|= |= |=
2 2  | |(((
3 3  Мнение автора: на основании своего опыта я выступаю скорее за анемичную модель: когда сущность в основном контейнер для данных, почти не содержащий логику, и наборе команд/сервисов для взаимодействия с ними (и именно на команды ложиться ответственность за сохранение консистентности агрегатов).
4 4  \\Для меня вполне допустим следующий вариант: в доменной логике мы не создаем и не редактируем сущности напрямую, а делаем это через ISetter компонент. В контракт конкретного ISetter мы закладываем способы создания и изменения сущности. В таком случае у нас есть компонент, который указывает на контракт и допустимые способы взаимодействия с конкретной сущностью.
5 -Пример поведения, располагаемого в ISetter: 1) типизированные билдеры под конкретные сценарии использования (инварианты), 2) взаимодействие со связанными сущностями (родительская-дочерняя) (добавление, смена родительской сущности), 3) вычисляемые свойства (которые меняются при изменении полей).
6 6  
6 +Пример поведения, располагаемого в ISetter:
7 +
8 +1. типизированные билдеры под конкретные сценарии использования (инварианты)
9 +1. взаимодействие со связанными сущностями (родительская-дочерняя) (добавление, смена родительской сущности)
10 +1. вычисляемые свойства (которые меняются при изменении полей).
11 +
7 7  У этого подхода еще есть плюс, связанный с [[Expression tree ~| Деревья выражений>>doc:Разработка.NET.C#.Рантайм и типы.Expression tree | Деревья выражений.WebHome]]. А именно мы легко можем строить Expression (например для проекции или Update запроса) (открытые setter).
8 -)))
9 -| |{{code language="c#"}}// Entity rules (interaction interface)
10 -IEntityServices<TEntity>
13 +)))|
14 +| |(((
15 +|{{code language="c#"}}// Entity rules (interaction interface)
16 +interface IEntityServices<TEntity>
11 11  {
12 12   // Set rules (single point of editing).
13 13   ITEntitySetter Setter { get; }
... ... @@ -14,6 +14,35 @@
14 14  
15 15   // Specification rules
16 16   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 Process(
46 + TEntity entity,
47 + Action<TInvariant1Dto> invariant1Handler,
48 + Action<TInvariant2Dto> invariant2Handler)
17 17  }{{/code}}
18 18  
19 19  
52 +)))|[[Specification>>doc:Архитектура и модели.Группа\. Архитектурные подходы.DDD | Domain-driven design.Specification.WebHome]]
53 +
54 +