Я экспериментирую с разработкой и созданием событий под управлением домена. Я планирую использовать (создание в C#) NServiceBus, EventStore и NES JOliver для их связывания. У меня уже есть инфраструктура, работающая для простого случая (один агрегированный корень со значениями только объектов).DDD: наследование и транзакции
Я читаю синюю книгу Эванса, и я пытаюсь разработать простую модель домена с примерами, взятыми из моего рабочего поля (ERP и CRM для компаний по обслуживанию HVAC).
Я моделирую простой поддомен, а именно машины HVAC и отношения между ними. Машины бывают разных типов, например. печи, горелки, кондиционеры, компрессоры, общие компоненты. Каждая машина может иметь несколько детских машин. Все типы машин имеют общие данные и некоторое общее поведение. Но у каждого типа есть дополнительные данные и специфическое поведение, например, вы можете добавить объект Burner только в печь.
Первый результат моего анализа состоит в том, что каждый компьютер должен быть совокупным корнем (который наследуется от AggregateBase в NES), поскольку он должен содержать ссылки на конкретную машину (например, для вставки записей восстановления, которые включают в себя одну машину , запись неисправностей и т. д.), а также уменьшить проблемы параллелизма в больших машинных деревьях.
Моя гипотеза состоит в том, таким образом, следующее:
public class Machine : AggregateBase
{
public DateTime InstallationDate { get; private set; }
public Guid ManufacturerId { get; private set; }
public Guid ModelId { get; private set; }
}
public class Furnace : Machine
{
public List<Burner> burners { get; private set; }
// other furnace properties
public void AddBurner(Burner burner)
{
// perform validation
this.Apply<BurnerAdded>(x=> x.burnerAdded = burner);
}
public void Handle(BurnerAdded @event)
{
this.burners.Add(@event.burnerAdded);
}
}
public class Burner : Machine
{
// burner specific properties/methods
}
, но у меня есть некоторые сомнения:
Является ли это правильный путь, чтобы представить свой домен? Я читал, что наследование класса не рекомендуется, но мне кажется, что это идеальный случай для его использования (Burner IS A Machine, также как и печь). Я ограничу только один уровень наследования.
Возможно ли реализовать наследование классов с помощью Event Sourcing? С предлагаемым технологическим стеком, в частности (nServiceBus, EventStore, NES)?
Как я могу выполнить добавление детской машины (например, горелки в печь)? Эту операцию можно разделить на две части:
- Добавить новый Burner в репозиторий Burner.
- Добавить ссылку на горелку в список горелок родительской печи Но эти две операции глобально изменяют два совокупных корня, поэтому операция должна выполняться двумя отдельными манипуляторами/транзакциями ... но вторая зависит от первого ... является ли это свидетельством некоторой ошибки моделирования? Я мог бы партии nServicebusMessages вместе, чтобы выполнить действия в одной транзакции, но я читал, что это не хорошо ...
Если я ребенок машина ссылаться на родителя, родитель теряет список детских машин (которые требуется для проверки), я не могу запросить репозиторий источников событий для других свойств, кроме Guid.
Спасибо заранее за любой вклад в обсуждение,
благодарит за вашу помощь. Дело в том, что горелка существует независимо от печи, это всего лишь компонент, который может быть переключен между печами (так что он определенно имеет идентичность), и на которые могут ссылаться непосредственно другие объекты домена (например, служебные инциденты) – Max