我正在读一本关于DDD的书,我看到一个涉及汽车,发动机,车轮和轮胎的示例域. 以上是本书中的模型.客户也是聚合根. 拥有该模型,可能存在引擎可具有高度,宽度和长度属性的情况. 当你需
以上是本书中的模型.客户也是聚合根.
拥有该模型,可能存在引擎可具有高度,宽度和长度属性的情况.
当你需要在小型车上安装大型发动机时会发生什么?引擎无法适应.
如果汽车检查发动机属性并允许它或不成为汽车的一部分,这是一个问题吗?
引擎具有全局标识(就像您知道每个引擎都有一个序列号/制造商号).也许引擎需要由制造商跟踪.
所以我再问一遍,如果汽车使用发动机的属性将其装入内部(允许它或不是它的一部分),这是一个问题吗?
Is it a problem if the car checks for the engine attributes and allows it or not to be a part of the car?
没有.
话虽这么说,您的验证可能足够复杂,以引入域服务.由于涉及两个聚合,您可以这样:
car.Fit(engine)
或这个:
engine.Fit(car)
但是,您可能想要检查汽车模型:)
由于规则会更高级并涉及一些数据,您可能想要引入域服务并可能在对象上使用双重调度:
所以,而不是car.Fit(引擎),你可以这样:
car.Fit(engine, IModelServiceImplementation)
并在Fit方法调用中:
if (!IModelServiceImplementation.CanFit(car, engine)) { throw new Exception(); }
该服务可能加载正确的模型,而不是检查引擎.根据域,甚至可能有修改级别和其他规则来处理.
由于Car实例不包含实际的Engine实例,而只包含EngineId或可能包含某个值对象,因此不会将引擎真正分配给汽车.您仍然可以将引擎实例传递给汽车并让它创建关联,但它认为合适.
‘Enrico S.’提出的解决方案可能与对聚合根进行更改的情况更为相关,其中可能没有所有聚合根可用,或者甚至聚合根存在于单独的有界上下文中.即使汽车和发动机位于不同的BC中,也许能够以某种方式查询有效性.有些东西可以用于最终的一致性,但其他东西可能不是.
像往常一样有很多事情需要考虑:)