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).

http://dddcommunity.org/library/vernon_2011/

Другие вопросы по тегам