领域驱动设计:聚合根可以有public setter吗?

Domain Driven Design : Can aggregate root have public setter?

如果我有聚合根说 User 它有 属性 像

public class User:BaseEntity
{


    public User()
    {
        //Ef Use
    }

    public User(string firstName, string secondName,
        string userName,Password password )
    {
        this.UserName = userName;
        this.Password = password;
        this.FirstName = firstName;
        this.SecondName = secondName;
    }

    public string UserName { get; private set;}
    public Password Password { get; private set;}
    public string FirstName { get; private set;}
    public string SecondName { get; private set;}
}

我可以像var naz=new User ("naz","password","firstName","secondname"一样创建新用户) 并使用 UserRepository 保存。 我应该如何编辑用户 fistname 属性 ?
我是否需要制作 public setter 并使用存储库保存? .
我很困惑,刚接触 DDD。我应该如何实现它。

域实体带有状态,您通常需要能够更改此状态。如果您使用的是 DDD 方法,您上面的示例看起来像这样。

  1. 在应用层调用update name方法提供id和新名称
  2. 应用层通过存储库获取用户域模型。
  3. 然后您可以在您的用户实体上调用更新名称方法或仅通过 setter.
  4. 进行设置
  5. 然后您保存您的实体。通常,您可能会使用跟踪对象更改的 ORM,在这种情况下,您只需从应用程序层调用存储库上的保存。

你的例子不是一个好的 DDD 例子,因为你的用户域模型基本上只是一个 DTO。

更新用户名可以通过调用这样的方法来完成:

public void ChangeUsername(string newName)
{
 //Check any required business rules.
 this.UserName = newName;
}

您获得的一点是,您可以检查与更改用户名相关的任何业务规则。

尽管 Ubiquitous-Language 使用这种方法会更加明确。