既然你都使用了领域服务和仓储这些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数据传输对象,它用来表示层和应用层之间传递数据,一般是由界面的需求而产生,但它不属于领域的范畴。
这个不好说
1.数据表和领域对象并不是一一对应
2.ddd中的值类型(不变)可以依附于领域对象中,并不需要单独创建对象
我也有同样的疑问,你现在怎么处理的。我觉得一种是通过表关联关系取得,还有是通过视图给视图建一个仓储来取得,还有的是不是就如你说的建一个包含A和B的类,同时建立一个特定的仓储来查询这个合并的数据
目前是写了对应的类只包含领域层的数据,ef用的leftjoin、groupjoin,做的多表查询,efcode用了include,结果用select映射出来
@luy710: 意思就是说通过写了特定的类包含A和B的这样一个,然后建对应的仓储通过ef的left join等方式查出来映射到此类是吧,查询这方法还是放在仓储层来实现
@sammy123: 对的,因为我用到的ABP基本上把仓储层基础的增删改查都给实现了,目前我把这类的查询也放在了仓储层实现,我也在考虑是不是应该放在业务层