Domain driven design 聚合根和聚合外部的值对象

Domain driven design 聚合根和聚合外部的值对象,domain-driven-design,aggregate,aggregateroot,value-objects,Domain Driven Design,Aggregate,Aggregateroot,Value Objects,我有一个总根“车” 汽车有一个包含“车轮”对象的值对象“车轮”列表。 由于汽车不应该没有轮子(至少根据我们的业务逻辑),为了建造汽车,这在适当的领域驱动设计中是有效的: double radius = 17.0; List<Wheel> carWheels = new List<Wheel>(); carWheels.add(new Wheel(radius)); Car aCar = new Car(carWheels); 双半径=17.0; 列表车轮=新列表();

我有一个总根“车” 汽车有一个包含“车轮”对象的值对象“车轮”列表。 由于汽车不应该没有轮子(至少根据我们的业务逻辑),为了建造汽车,这在适当的领域驱动设计中是有效的:

double radius = 17.0;
List<Wheel> carWheels = new List<Wheel>();
carWheels.add(new Wheel(radius));
Car aCar = new Car(carWheels);
双半径=17.0;
列表车轮=新列表();
车轮。添加(新车轮(半径));
汽车aCar=新车(车轮);
我的问题基本上是,在聚合根之外实例化值对象以构造聚合根(在构造函数中传递值对象)是否是一种好的做法。
我不想在无效状态下创建聚合根,希望遵循最佳实践。如果上面的代码不是最佳实践,那么应该怎么做呢?

我喜欢这种方法。在测试用例中,我们可以将短/模拟车轮注入到汽车中


如果在车轮或汽车的制造过程中存在复杂的业务限制,我会引入汽车制造厂。

我喜欢这种方法。在测试用例中,我们可以将短/模拟车轮注入到汽车中


如果在车轮或汽车的制造过程中存在复杂的业务限制,我会介绍一家汽车制造厂。

我认为这既不是一个坏做法,也不是一个好做法。所有这些都取决于您试图建模的实际域。在某些情况下,在聚合之外创建这些VO是有意义的,而在另一些情况下,它只会打开您的域进行恶意使用。DDD迫使您忘记一些技术问题和好/坏做法,以便专注于实际领域:

  • 在任何情况下,制造一辆26轮的汽车都有意义吗?您的示例模型允许这样做
  • 在任何情况下,创造一辆四轮汽车,每一轮都有不同的半径,这有什么意义?您的示例模型允许这样做
  • 创造一个半径为17.3284546的轮子有什么意义?同样,您的模型允许这种情况发生

  • 因此,在我看来,对于您展示的示例,,最好在聚合本身内部处理这些不变量,因为您可以很好地限制事情的数量,而不是在创建汽车和车轮时对它们所做的事情。然而,这来自于对领域本身的更仔细的观察,而不是依赖于广为人知的好的或坏的实践。只是重申一下,在某些情况下,通过在聚合之外创建VO,您会受益匪浅。一切都取决于领域。

    我认为这既不是一个坏习惯,也不是一个好习惯。所有这些都取决于您试图建模的实际域。在某些情况下,在聚合之外创建这些VO是有意义的,而在另一些情况下,它只会打开您的域进行恶意使用。DDD迫使您忘记一些技术问题和好/坏做法,以便专注于实际领域:

  • 在任何情况下,制造一辆26轮的汽车都有意义吗?您的示例模型允许这样做
  • 在任何情况下,创造一辆四轮汽车,每一轮都有不同的半径,这有什么意义?您的示例模型允许这样做
  • 创造一个半径为17.3284546的轮子有什么意义?同样,您的模型允许这种情况发生

  • 因此,在我看来,对于您展示的示例,,最好在聚合本身内部处理这些不变量,因为您可以很好地限制事情的数量,而不是在创建汽车和车轮时对它们所做的事情。然而,这来自于对领域本身的更仔细的观察,而不是依赖于广为人知的好的或坏的实践。只是重申一下,在某些情况下,通过在聚合之外创建VO,您会受益匪浅。这一切都取决于领域。

    在这个具体的例子中,我会给汽车的建造师半径,让它自己建造车轮。这样,您就可以从客户机的代码中隐藏实例化细节(聚合之外的知识更少),并且您的客户机不会受到Car聚合内部更改的影响


    您应该更喜欢只在一个步骤/操作/操作中构建聚合。如果这不仅仅是一个步骤,那么你的聚合必然会显示出它内部结构的一些细节。

    在这个具体的例子中,我会给汽车的构造器提供半径,让它自己建造车轮。这样,您就可以从客户机的代码中隐藏实例化细节(聚合之外的知识更少),并且您的客户机不会受到Car聚合内部更改的影响


    您应该更喜欢只在一个步骤/操作/操作中构建聚合。如果这不是一个步骤,那么您的聚合不可避免地会显示其内部结构的一些细节。

    谢谢。你觉得轮子里面的验证怎么样?@i任何你可能会发现一些有用的东西,谢谢。您如何看待轮子内部的验证?@i您可能会发现一些有用的东西,任何轮子的允许尺寸都可以在轮子内部进行验证。每辆车的车轮数量和配置可在车内验证。这里有两个独立的验证。在应用程序的某个地方,制造100个车轮(即:一次不只是4个车轮)也是有意义的。我接受你的回答,这不是一个好的或坏的做法,这取决于域名。谢谢。任何车轮的允许尺寸都可以在车轮内部进行验证。每辆车的车轮数量和配置可在车内验证。这里有两个独立的验证。在应用程序的某个地方,制造100个车轮(即:一次不只是4个车轮)也是有意义的。我接受你的回答,这不是一个好的或坏的做法,这取决于域名。非常感谢。