加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oop – 聚合根的行为是否应该依赖于其他聚合根的属性?

发布时间:2020-12-14 04:51:29 所属栏目:百科 来源:网络整理
导读:我正在读一本关于DDD的书,我看到一个涉及汽车,发动机,车轮和轮胎的示例域. 以上是本书中的模型.客户也是聚合根. 拥有该模型,可能存在引擎可具有高度,宽度和长度属性的情况. 当你需要在小型车上安装大型发动机时会发生什么?引擎无法适应. 如果汽车检查发动机
我正在读一本关于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中,也许能够以某种方式查询有效性.有些东西可以用于最终的一致性,但其他东西可能不是.

像往常一样有很多事情需要考虑:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读