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

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

От версии 1.1
отредактировано Alexandr Fokin
на 2026/09/15 12:45
Изменить комментарий: К данной версии нет комментариев
К версии 1.10
отредактировано Alexandr Fokin
на 2026/09/15 13:28
Изменить комментарий: К данной версии нет комментариев

Сводка

Подробности

Свойства страницы
Содержимое
... ... @@ -1,0 +1,59 @@
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 +|(((
16 +1. Единая точка для взаимодействия с сущностью (агрегатом).
17 +Комментарии.
18 +Изменение в одном месте влияет на все (целостность).
19 +1. Наглядный интерфейс для взаимодействия (как можно взаимодействовать с сущностью).
20 +)))|{{code language="c#"}}// Entity rules (interaction interface)
21 +interface IEntityServices<TEntity>
22 +{
23 + // Set rules (single point of editing).
24 + ITEntitySetter Setter { get; }
25 +
26 + // Specification rules
27 + ITEntityConditions Conditions { get; }
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 +
57 +)))|[[Specification>>doc:Архитектура и модели.Группа\. Архитектурные подходы.DDD | Domain-driven design.Specification.WebHome]]
58 +
59 +