我发现从不同来源建模域驱动架构的不同方法。但是,作为最佳实践,是否最好将对象的验证放入其属性设置器中,以使设置器保持私密性?还是将属性本身设为私有并在构造函数中执行验证?
private string _lastName;
public string LastName
{
get
{
return this._lastName;
}
set
{
if(value == null)
{
return;
//or throw exception
}
_lastName = value;
}
如果我有任何错误,请纠正我。
根据我的经验,DDD最初的属性应在构造函数中设置,并具有内部带有验证的私有set方法(如果需要,可以在构造函数中进行一些更复杂的验证(如果需要传递服务等))。
如果您的域逻辑要求在创建对象之后更新某些属性,则有两个选择:
UpdateMyProperty()
public MyProperty{public get; public set;}
使用相同的属性这取决于域逻辑的复杂程度。如果需要其他服务,请使用选项1,因为您可以将服务作为参数传递。如果只是简单的值更新,请使用选项2
验证方法实际上可能有所不同。如果您拥有一个永远不会为null或为空的属性,则最好在定义中使用private set并使用方法设置该属性。
public class User
{
public string LastName {get; private set;}
public void SetLastName(string lastName)
{
if(string.IsNullOrEmpty(lastName))
throw new Exception("LastName must be filled.");
LastName = lastName;
}
}
这提供了更好的可读性。使用更多属性时,属性设置器很难检查。如果您有实体类,并且属性验证取决于调用的操作,则可以使用操作确认,例如;
public class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public void UpdateLastName()
{
ConfirmToUpdate();
//do db actions.
}
private void ConfirmToUpdate()
{
if (Id <= 0 || string.IsNullOrEmpty(LastName))
throw new Exception("Properties are not correct to update");
}
}