首页 新闻 会员 周边

领域驱动模式架构中 领域服务层 和 仓储层的疑惑

0
悬赏园豆:30 [已解决问题] 解决于 2019-08-22 09:41

现在使用的框架中分了领域服务层和仓储层,并且使用到了ABP,目前遇到问题领域服务层和仓储层有些功能上的混淆

请教下这两层的使用区别以及关联。

目前遇到一个问题:比如现在有A,B两张表 ,业务逻辑是查寻A表中A1、A2以及B表中B1、B2一共四个字段,我是应该在A仓储层中查找A1、A2,在B仓储层中查找B1、B2 ,   然后返回到领域服务层去进行数据处理吗? 如果这样,仓储层返回的时候要新建两个类来分别包含A1、A2,B1、B2吗?

< >
分享
最佳答案
1

既然你都使用了领域服务和仓储这些DDD的概念,那么你考虑问题尤其是业务逻辑的问题时,应该从领域实体的角度来考虑,而不是动不动就想到数据表和字段,数据存储和查询的问题由仓储帮你搞定。

对于你说到的A和B两个表,我们假定它们分别映射为A和B两种领域对象的类型。那么接下来要搞清的是,它们是互有关联的两个实体对象类型,还是一个是实体类型另一个是值类型。先假设是前者吧

public class AEntity : Entity

{

     public int A1 {get;set;}

     public string A2{get;set;}

     //others

     public  BEntity B{ get;set;} 

}

那么仓储层查询加载AEntity实体对象时,ORM能自动加载它所包含的B对象,仓储会自动执行联接查询,或者当你访问A对象的B属性时,仓储帮你即时加载B属性所引用的BEntity实体对象,这叫延迟加载。

你只要让仓储为你返回AEntity就行了,这些事情仓储层的ORM帮你搞定。

没有必要专门设计一个类只包含A1A2B1B2,至少领域层不应该有这么个类,因为它明显不是个领域实体对象或者领域值对象。

 

 

如果你觉得某个地方真的需要只包含A1A2B1B2这几个属性的对象来承载数据,那么我猜应该是表示层(UI或者对外部的接口)中才需要,不过,这种对象应该是叫做DTO数据传输对象,它用来表示层和应用层之间传递数据,一般是由界面的需求而产生,但它不属于领域的范畴。

 

 

 

收获园豆:20
西漠以西 | 小虾三级 |园豆:1675 | 2017-11-01 09:51
其他回答(2)
0

这个不好说

1.数据表和领域对象并不是一一对应

2.ddd中的值类型(不变)可以依附于领域对象中,并不需要单独创建对象

收获园豆:10
Daniel Cai | 园豆:10424 (专家六级) | 2017-10-31 17:15
0

我也有同样的疑问,你现在怎么处理的。我觉得一种是通过表关联关系取得,还有是通过视图给视图建一个仓储来取得,还有的是不是就如你说的建一个包含A和B的类,同时建立一个特定的仓储来查询这个合并的数据

sammy123 | 园豆:174 (初学一级) | 2019-08-17 11:34

目前是写了对应的类只包含领域层的数据,ef用的leftjoin、groupjoin,做的多表查询,efcode用了include,结果用select映射出来

支持(0) 反对(0) luy710 | 园豆:172 (初学一级) | 2019-08-18 22:59

@luy710: 意思就是说通过写了特定的类包含A和B的这样一个,然后建对应的仓储通过ef的left join等方式查出来映射到此类是吧,查询这方法还是放在仓储层来实现

支持(0) 反对(0) sammy123 | 园豆:174 (初学一级) | 2019-08-20 20:11

@sammy123: 对的,因为我用到的ABP基本上把仓储层基础的增删改查都给实现了,目前我把这类的查询也放在了仓储层实现,我也在考虑是不是应该放在业务层

支持(0) 反对(0) luy710 | 园豆:172 (初学一级) | 2019-08-22 09:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册