Я все еще изучаю чистую архитектуру и сейчас пытаюсь реализовать в проекте сбор событий. У меня есть 2 проекта, один из которых содержит команды и события, а другой - модель предметной области. По определению чистой архитектуры доменная модель является центром всего. Все ссылается на него. Но все примеры, которые я нашел, показывают, что в модели предметной области есть Apply методы для каждого события.

Нужно ли мне это делать в модели предметной области? Или есть другой способ?

В какой-то момент кода мне нужно восстановить модель предметной области по событиям примерно так:

public void Load(events){
foreach(var event in events)
{
   Apply(event);
}}

Это должно быть в классе модели предметной области, например в методе Apply. Метод Apply изменяет внутреннее состояние модели предметной области.

0
milandjukic88 10 Ноя 2021 в 15:42
Не могли бы вы предоставить несколько примеров кода, чтобы нам было немного легче это представить? Ваше здоровье
 – 
Tatranskymedved
10 Ноя 2021 в 15:46
3
Это довольно широко. Очевидно, что в программировании есть тысячи способов сделать что-нибудь. Очевидно, вы читаете книгу или учитесь из какого-то источника и предполагаете, что все мы знаем, о чем вы говорите. Пожалуйста, отредактируйте свой вопрос, чтобы добавить больше контекста к вашему вопросу.
 – 
Heretic Monkey
10 Ноя 2021 в 15:48
«Но все примеры, которые я нашел, показывают, что в модели предметной области есть методы Apply для каждого события». - почему здесь есть «но»? Как еще вы бы применили изменения к своей модели домена?
 – 
Fildor
10 Ноя 2021 в 15:51
1
Ах хорошо. Думаю, этот пример действительно помог понять ваше заблуждение. Смотрите, что модель (домена) должна удерживать текущее состояние домена. Если вы запускаете систему, она не имеет состояния или пустого состояния, если хотите. Поэтому вам нужно разогреть его, задав ему семя, а затем выполнить все исторические изменения этого состояния до тех пор, пока вы не получите текущее состояние.
 – 
Fildor
10 Ноя 2021 в 15:55
1
Это не только нормально, но и вам необходимо . В противном случае вы не смогли бы выполнить то, что называется «воспроизведение».
 – 
Fildor
10 Ноя 2021 в 16:00

1 ответ

Лучший ответ

все примеры, которые я нашел, показывают, что в модели предметной области есть методы Apply для каждого события. Нужно ли мне это делать в модели предметной области?

Вам не «обязательно» делать это, но это вероятный результат в дизайне Kingdom of Nouns. Поскольку большая часть раннего развития предметно-ориентированного дизайна (Java) и источников событий (C #) происходила в Королевстве существительных, примеры, как правило, разделяют эти шаблоны.

В шаблоне Apply вы видите результат двух разных идей.

Во-первых, идея о том, что все модели с источником событий имеют одинаковую базовую структуру данных (Истина - это история событий), поэтому мы должны использовать единую общую реализацию общего назначения для всех из них.

Во-вторых, информация, которую мы кэшируем в модели данных (также известная как «свойства» объекта модели), должна выглядеть «одинаково» независимо от того, смотрим ли мы на исходный объект, обработавший команду, или вместо этого смотрим на копию этой модели. загружается из истории.

Таким образом, возникла закономерность, согласно которой модели имеют тенденцию «наследовать» от некоторого базового класса, который владеет историей событий и API для координации изменений как в истории, так и в собственном внутреннем кэше моделей, и что обработчики команд на модели работают, сначала вычисляя, что должны произойти изменения (события), затем применить эти изменения с использованием тех же путей кода, которые использовались бы при перезагрузке истории событий.

2
VoiceOfUnreason 10 Ноя 2021 в 18:23
Стоит отметить, что в «Королевстве глаголов» (также известном как «функциональное программирование») событие - это не что иное, как функция, отображающая состояние (альтернативный «объект модели») на состояние / «объект модели»; вездесущий язык этого Королевства, вероятно, будет относиться к «применению события к состоянию» (благодаря истории Lisp / Scheme, если ничто иное).
 – 
Levi Ramsey
10 Ноя 2021 в 18:53
Существует также не кажущийся абсурдным аргумент, что большая часть DDD / ES и связанных с ним практик просто втягивает функциональное программирование в «предприятие» ...
 – 
Levi Ramsey
10 Ноя 2021 в 18:57