DDD:更新实体的多个属性的指南

ser*_*gio 4 .net c# domain-driven-design software-design

所以,我决定学习DDD,因为它似乎解决了我一直面临的一些架构问题.虽然有很多视频和示例博客,但我还没有遇到一个指导我解决以下场景的方法:

假设我有实体

public class EventOrganizer : IEntity
{
    public Guid Id { get; }

    public string Name { get; }

    public PhoneNumber PrimaryPhone { get; }

    public PhoneNumber AlternatePhone { get; private set; }

    public Email Email { get; private set; }

    public EventOrganizer(string name, PhoneNumber primaryPhoneNr)
    {
        #region validations

        if (primaryPhoneNr == null) throw new ArgumentNullException(nameof(primaryPhoneNr));

        //validates minimum length, nullity and special characters
        Validator.AsPersonName(name);

        #endregion

        Id = new Guid();
        Name = name;
        PrimaryPhone = primaryPhoneNr;
    }
}    
Run Code Online (Sandbox Code Playgroud)

我的问题是:假设这将被转换并提供给MVC视图,并且用户想要更新AlternatePhone,电子邮件以及对于给定的有界上下文在该实体中存在有意义的许多其他属性(为简洁起见未示出) )

我知道正确的指导是为每个操作设置一个方法,但是(我知道它的反模式的KINDA)我无法帮助但不知道这是否会最终触发数据库上的多个更新调用.

这是怎么处理的?在某个地方,是否会有一些东西可以将我的EventOrganizer映射到某些东西 - 例如DbEventOrganizer并收集对域实体所做的所有更改并一次性应用这些更改?

pla*_*alx 7

DDD更适合基于任务的UI.你所描述的是非常CRUD的.在您的情况下,单个属性被视为独立的数据字段,其中一个或多个可以通过单个通用业务操作(更新)进行更新.

如果您想成功使用DDD,则必须对域进行更深入的分析.

为什么有人会一起更新所有这些字段?用户试图实现的隐式业务操作是什么?有没有通过改变表示更具体的业务流程PrimaryPhone,AlternatePhoneEmail在一起呢?

也许那就是改变ContactInformation一个EventOrganizer?如果是这种情况,那么您可以建模单个ChangeContactInformation操作EventOrganizer.然后,您的UI将发送ChangeContactInformation命令而不是update命令.

至于聚合根(AR)的持久性,如果你使用的是RDBMS,这通常由像NHibernate这样的ORM来处理.但是,还有其他方法可以保留您的AR,例如Event Sourcing,NoSQL DB,甚至在RDBMS中存储JSON或任何其他数据交互格式.

  • @Sergio 我很高兴能帮上忙!需要明确的是,`ContactInformation` 应该是一个值对象。不要将诸如 PrimaryPhone、Email 等的单个 VO 作为单独的参数传递给 `ChangeContactInformation` 方法。 (2认同)