领域驱动设计:聚合根可以有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 方法,您上面的示例看起来像这样。
- 在应用层调用update name方法提供id和新名称
- 应用层通过存储库获取用户域模型。
- 然后您可以在您的用户实体上调用更新名称方法或仅通过 setter.
进行设置
- 然后您保存您的实体。通常,您可能会使用跟踪对象更改的 ORM,在这种情况下,您只需从应用程序层调用存储库上的保存。
你的例子不是一个好的 DDD 例子,因为你的用户域模型基本上只是一个 DTO。
更新用户名可以通过调用这样的方法来完成:
public void ChangeUsername(string newName)
{
//Check any required business rules.
this.UserName = newName;
}
您获得的一点是,您可以检查与更改用户名相关的任何业务规则。
尽管 Ubiquitous-Language 使用这种方法会更加明确。
如果我有聚合根说 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 方法,您上面的示例看起来像这样。
- 在应用层调用update name方法提供id和新名称
- 应用层通过存储库获取用户域模型。
- 然后您可以在您的用户实体上调用更新名称方法或仅通过 setter. 进行设置
- 然后您保存您的实体。通常,您可能会使用跟踪对象更改的 ORM,在这种情况下,您只需从应用程序层调用存储库上的保存。
你的例子不是一个好的 DDD 例子,因为你的用户域模型基本上只是一个 DTO。
更新用户名可以通过调用这样的方法来完成:
public void ChangeUsername(string newName)
{
//Check any required business rules.
this.UserName = newName;
}
您获得的一点是,您可以检查与更改用户名相关的任何业务规则。
尽管 Ubiquitous-Language 使用这种方法会更加明确。