DDD值对象的嵌套

时间:2019-02-05 20:00:02

标签: c# domain-driven-design cqrs event-sourcing value-objects

我正在寻找有关DDD建模的建议,尤其是ValueObjects的嵌套级别。

采用下面的代码,这是我的域如何开始成形的精简示例。这些全部在我的“合同”范围内,并且已将“合同”标识为聚合根。基于与领域专家的讨论会,这确实很有意义,但我想知道我是否会以错误的方式进行操作。

我与此嵌套有关的问题是:

1-我现在已经失去了创建简洁的域事件(如TreatyDetailsCreated)的能力,但是需要将事件的级别提高到ContractConded以上。

2-我的命令再次开始遵循这种类似的嵌套格式,导致它们变得不清楚

3-现在,每次我需要更新图形中的深层内容并且不需要这些较高值的对象来强制执行不变式时,我都必须加载合同。

我的问题是,我是否可以更好地研究将第一级嵌套对象定义为aggreagtes?这将解决我的嵌套问题,并让我获得描述性领域事件。我的不变量将仅在提交时在合同级别上执行,由于复杂性,很可能会在域服务中进行处理,因此合同比任何东西都更像一个逻辑容器。

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 :(得分:0)

因此,在这里花了一些时间浏览“ DDD”查询的搜索结果后,我偶然发现了沃恩·弗农(Vaughn Vernon)的一篇文章,该文章为我提供了帮助我继续前进的指针。

根据文章的内容,它已经确认我的停赛我应该有多个汇总。因此,对于我的示例,我将拥有TreatyDetails和Contract,其中Contract将返回引用(TreatyDeatilsId)。

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