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

Версия 1.6 от Alexandr Fokin на 2026/09/15 13:22

Последние авторы
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 Process(
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