DDD Вложенность объектов-значений
Я ищу несколько советов по моделированию DDD и конкретно вложенным уровням ValueObjects.
Возьмите приведенный ниже код, это дурацкий пример того, как мой домен начинает обретать форму. Это все в рамках контекста моего Контракта и определило Контракт как совокупный корень. Это имеет смысл, основываясь на обсуждениях с экспертом по предметной области, но мне интересно, пойду ли я по этому поводу неправильно.
Проблема с этим вложением заключается в том, что:
1 - Я потерял возможность создавать краткие события в домене, такие как ContractDetailsCreated, но вместо этого мне нужно запускать события на уровень выше, поэтому ContractCreated в качестве примера.
2 - Мои команды начинают следовать этому похожему формату вложения, что приводит к потере ясности
3 - Теперь я вынужден загружать Контракт каждый раз, когда мне требуется обновить что-то глубоко в графике, и что эти объекты с более высокими значениями не требуются для принудительного применения инвариантов.
Мой вопрос заключается в том, лучше ли мне рассмотреть возможность определения вложенных объектов первого уровня как совокупности? Это решило бы мою проблему с вложением и позволило бы мне получить описательные события в домене. Мои инварианты будут применены только на уровне Контракта в момент их представления и, вероятно, будут обрабатываться в рамках Службы домена из-за сложностей, поэтому Контракт больше похож на логический контейнер.
public class CreateContractCommand
{
public CreateTreatyDetails CreateTreatyDetails { get; set; }
}
public class CreateTreatyDetails
{
public string Umr { get; set; }
}
public class Contract : Aggregate
{
internal TreatyDetails TreatyDetails { get; private set; }
private Contract() { }
public static Contract Create(CreateContractCommand command)
{
var contract = new Contract {TreatyDetails = new TreatyDetails(command.CreateTreatyDetails)};
//Raise domain events
return contract;
}
}
public class TreatyDetails : ValueObject
{
//Additional properties removed for simplicity
public Umr Umr { get; private set; }
public TreatyDetails(CreateTreatyDetails createTreatyDetails)
{
Umr = new Umr(createTreatyDetails.Umr);
}
}
public class Umr : ValueObject
{
public string Value { get; private set; }
public Umr(string value)
{
//Validate value
Value = value;
}
}
1 ответ
Поэтому, потратив некоторое время здесь, просматривая результаты поиска по запросу "DDD", я наткнулся на эссе Вона Вернона, которое подсказало мне, как помочь мне продолжить свое путешествие.
Основываясь на содержании эссе, я подтвердил, что у меня должно быть несколько агрегатов. Так что для моего примера у меня будут ContractDetails и Contract, где в Contract будет указана ссылка (ContractDeatilsId).