DDD Вложенность объектов-значений - PullRequest
0 голосов
/ 05 февраля 2019

Я ищу несколько советов по моделированию 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;
    }
}

1 Ответ

0 голосов
/ 06 февраля 2019

Поэтому, потратив некоторое время здесь, просматривая результаты поиска по запросу «DDD», я наткнулся на эссе Вона Вернона, которое подсказало мне, как помочь мне продолжить свое путешествие.

Основываясь на содержании эссе, я подтвердил, что я должен иметь несколько агрегатов.Так что для моего примера у меня будут ContractDetails и Contract, где у Contract будет ссылка (ContractDeatilsId) назад.

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

...