领域驱动设计:聚合根可以有公共设置者吗?

时间:2015-02-12 06:01:58

标签: design-patterns repository domain-driven-design

如果我有一个聚合根用户它有像

这样的属性
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属性?
我是否需要使用存储库创建公共setter和Save? 。
我很困惑,对DDD很陌生。我该怎么做呢。

2 个答案:

答案 0 :(得分:0)

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

  1. 在提供ID和新名称的应用层上调用更新名称方法。
  2. 应用层通过存储库获取用户域模型。
  3. 然后,您可以在用户实体上调用update name方法,也可以通过setter设置它。
  4. 然后保存您的实体。通常,您可以使用跟踪对象更改的ORM,在这种情况下,您只需从应用程序层调用repo上的save。
  5. 您的示例不是一个好的DDD示例,因为您的用户域模型基本上只是一个DTO。

答案 1 :(得分:0)

更新用户名可以通过调用如下方法来完成:

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

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

尽管普遍存在的语言在这种方法中会更加明确。