Исходный код вики Мнение
Редактировал(а) Alexandr Fokin 2026/09/15 13:34
Последние авторы
| author | version | line-number | content |
|---|---|---|---|
| 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 | ||
| 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<TParameter>( | ||
| 51 | TEntity entity, | ||
| 52 | TParameter param, | ||
| 53 | Action<param, TInvariant1Dto> invariant1Handler, | ||
| 54 | Action<param, TInvariant2Dto> invariant2Handler) | ||
| 55 | }{{/code}} | ||
| 56 | |||
| 57 | |||
| 58 | )))|[[Specification>>doc:Архитектура и модели.Группа\. Архитектурные подходы.DDD | Domain-driven design.Specification.WebHome]] | ||
| 59 | |||
| 60 |