域驱动设计 – 如何避免贫血域层,仍然有丰富的验证和业务规则

如果您有一个域对象,并且您希望对该域对象的责任做一些有用和中心的事情,如确保其有效,则有时需要访问相关对象的状态才能执行此验证.

如何避免域对象需要调用到存储库或数据访问层?即使使用延迟加载,由于性能,您也不能总是走集合关系,并且您经常希望在域对象中执行查询.您可以将依赖注入资源库实现到域中,但不是真正纯粹的并且使测试复杂化.

我一直放松的东西,并允许从域访问到使用DI的存储库.我没有看到如何在复杂的应用程序中拥有一个“纯粹的”域层的清晰示例,这个层不是贫血的,并且有一个服务/应用程序层做所有的咕噜声,弄乱了域对象的内部.

解决方法

>如果对象是一个值对象,它就是
应该是不变的和验证的
施工期间
>如果对象
一个根集合,它的
自己的国家足以告诉你
如果有效,您可以添加
一种验证方法,其中
通过聚合级联.
最后,我认为这是你的主要
关心,如果你需要访问
几个相关的对象(即
不在同一个集合)确保
其中一个是有效的,你
最终需要驱逐出来
特定验证服务中的逻辑.

我认为将服务和存储库注入实体不是最佳选择.创建专用服务似乎更合适,我不明白为什么会导致您有贫血域对象.

简而言之,如果您可以在不依赖服务或存储库的情况下验证对象状态,请让对象在聚合根级别处理它.当您需要查询服务或存储库时,或者当您需要其他实体时,强烈地考虑将该逻辑移到对象之外.

相关文章

vue阻止冒泡事件 阻止点击事件的执行 <div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些