Я ищу несколько советов по моделированию DDD и определенно вложенным уровням ValueObjects.
Возьмите приведенный ниже код, это дурацкий пример того, как мой домен начинает формироваться.Это все в рамках контекста моего Контракта и определило Контракт как совокупный корень.Это имеет смысл, основываясь на обсуждениях с экспертом по предметной области, но мне интересно, правильно ли я поступаю по этому поводу.
Проблема, с которой я сталкиваюсь в этой вложенности, заключается в следующем:
1 - Iтеперь потеряли возможность создавать краткие доменные события, такие как 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;
}
}