【问题标题】:Validating a domain object for persistence验证域对象的持久性
【发布时间】:2009-12-15 22:37:22
【问题描述】:

在我目前正在开发的系统中,我通过将域业务规则的验证与持久性约束分开来遵循 SRP(我认为!)。让我们使用过度使用的客户示例。假设客户必须具有有效的邮政编码、街道地址和姓名才能满足系统的业务规则。让我们进一步说,客户选择的用户名在所有客户中必须是唯一的,我将其定义为持久性约束。请考虑以下“未准备好投入生产”的伪代码:

public interface IPersistenceValidator<T>
{
    bool IsValidForPersistence(T domainObj, IList<ValidationError> validationErrors);
}

public interface IValidatable
{
    bool IsValid(IList<ValidationError> validationErrors);
}

public class Customer : IValidatable
{
    public bool IsValid(IList<ValidationError> validationErrors)
    {
        //check for business rule compliance
    }
}

public class CustomerDao : IPersistenceValidator<Customer>
{
    public bool IsValidForPersistence(Customer domainObj, IList<ValidationError> validationErrors)
    {
        //check for persistence constraint compliance (user name is unique)
    }

    public bool SaveCustomer(Customer customer)
    {
        //save customer
    }
}

上面定义的类可能会被连接成一个服务类,如下所示:

   public class SaveCustomerService
    {
        private CustomerDao _customerDao;

        public SaveCustomerService(CustomerDao customerDao)
        {
            _customerDao = customerDao;
        }

        public bool SaveCustomer(Customer customer)
        {
            IList<ValidationError> validationErrors = new List<ValidationError>();
            if (customer.IsValid(validationErrors))
            {
                if (_customerDao.IsValidForPersistence(customer, validationErrors))
                {
                    return _customerDao.SaveCustomer(customer);
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
    }

我对这种方法的主要担心是 CustomerDao 的未来使用者必须知道在 SaveCustomer() 之前调用 IsValidForPersistence(),否则无效数据会被保留。我可以在 SQL 级别创建数据库约束来防止这种情况,但这感觉就像是一个杂物。

似乎 IsValidForPersistence() 应该移动到 CustomerDao.SaveCustomer() 但我必须重构 SaveCustomer() 的签名以包含对 ValidationErrors 类的引用。在我深入研究这么大的重构之前,我想从其他人那里获得一些关于处理这些问题的常见/首选模式的反馈。

谢谢

【问题讨论】:

    标签: validation persistence dns design-patterns single-responsibility-principle


    【解决方案1】:
    • 如果您想解决验证问题,请先检查 HERE;

      public class Address {
      
          @NotNull private String line1;
          private String line2;
          private String zip;
          private String state;
      
          @Length(max = 20)
          @NotNull
          private String country;
      
          @Range(min = -2, max = 50, message = "Floor out of range")
          public int floor;
      
              ...
      

      }

      无论如何,您必须检查数据库中的用户名。你可以自定义你的验证(比如去检查数据库是否是唯一的)。查看其他详细信息的链接。

    • 检查休眠validator
    • 检查 Using the Validator framework 来自 jboss
    • 您可以阅读域层中的验证partI、partII,这不是java,但逻辑很重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 2021-04-05
      相关资源
      最近更新 更多