【问题标题】:How to validate domain objects in DDD architecture?如何在 DDD 架构中验证域对象?
【发布时间】:2019-12-27 13:01:25
【问题描述】:

我从不同的来源找到了对领域驱动架构进行建模的不同方法。但作为最佳实践,最好将对象的验证放在它的属性设置器中,保持设置器私有?还是将属性设为私有并在构造函数中执行验证?

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 根据选项2,没有封装吧?因为从服务中可以通过为其分配一个值来设置属性,因为它的设置器是公共的。
  • 是的,可能封装被最小化了,属性设置器不应该用在更复杂的逻辑中。在其他一些语言中,只有方法可以用于类似情况。但是由于 C# 有这个属性特性,我看不出有什么理由不使用它而不是方法,当然,对于非常简单的更新。
猜你喜欢
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 2012-06-20
  • 2020-07-26
  • 2018-10-17
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多