如何在DDD体系结构中验证域对象?

问题描述 投票:0回答:2

我发现从不同来源建模域驱动架构的不同方法。但是,作为最佳实践,是否最好将对象的验证放入其属性设置器中,以使设置器保持私密性?还是将属性本身设为私有并在构造函数中执行验证?

private string _lastName;
public string LastName
{
      get 
      {
        return this._lastName;
      }
      set
      {
        if(value == null)
        {
          return;
          //or throw exception
        } 

        _lastName = value;
      } 

如果我有任何错误,请纠正我。

c# asp.net asp.net-core domain-driven-design getter-setter
2个回答
0
投票

根据我的经验,DDD最初的属性应在构造函数中设置,并具有内部带有验证的私有set方法(如果需要,可以在构造函数中进行一些更复杂的验证(如果需要传递服务等))。

如果您的域逻辑要求在创建对象之后更新某些属性,则有两个选择:

  1. 添加方法UpdateMyProperty()
  2. 与公共设置器public MyProperty{public get; public set;}使用相同的属性

这取决于域逻辑的复杂程度。如果需要其他服务,请使用选项1,因为您可以将服务作为参数传递。如果只是简单的值更新,请使用选项2


0
投票

验证方法实际上可能有所不同。如果您拥有一个永远不会为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");
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.