首页新闻找找看学习计划

关于DDD同 EF Repository

0
[已解决问题] 解决于 2016-06-29 19:29

DDD里面的实体对象同EF Database First生成的实体有啥区别?

为什么有的例子里面,IRepository<T>,这个T继承子一个基类(例如叫做EntityBase);但是这个EntityBase同EF里自动生成的数据实体不是一个东西。我一直不明白,这样做的话保存到数据库的时候没问题吗。

希望不吝赐教!!!!!

黑白Ketty的主页 黑白Ketty | 菜鸟二级 | 园豆:208
提问于:2016-06-29 13:21
< >
分享
最佳答案
0

所以有codefirst的概念.

开发的时候完全不要去管数据库怎么.只管对象的格式.

奖励园豆:5
吴瑞祥 | 高人七级 |园豆:28731 | 2016-06-29 16:15

非常感谢!

黑白Ketty | 园豆:208 (菜鸟二级) | 2016-06-29 19:31
其他回答(1)
2

刚好在做这样的一个项目,我回答一下你的问题:

 

1. DDD实体对象和EF Database First生成的实体有啥区别:这是两个概念,EF Database First是由数据库生成“实体”,这个“实体”全部是一些属性字段,这个过程是技术生成的结果;而DDD实体对象和EF没有任何关系,它是你领域模型设计的一部分,是你业务系统中“业务”的具体代码体现,这其中不只包含一些属性字段,还有一些实体行为等等,也就是说DDD的实体对象是“有生命的”,所以,我们一般在DDD开发中,使用EF Code First,由代码生成数据库,而不是EF Database First。

2. IRepository<T>,一般会设计为:IRepository<IAggregateRoot>,比如下面的设计:

public interface IRepository<TAggregateRoot> 
    where TAggregateRoot : class, IAggregateRoot
{
    IQueryable<TAggregateRoot> Get(int id);

    IQueryable<TAggregateRoot> GetAll();
}

IAggregateRoot表示聚合根的意思,它是DDD中的概念,并不是EF技术上的,IAggregateRoot一般会设计成接口的形式,比如下面设计:

public interface IAggregateRoot
{
    int Id { get; }
}

回到上面的问题,为什么要这样设计IRepository<IAggregateRoot>,就是为了避免重复代码的需要,Repository的作用是查询聚合根对象,一个聚合根下面有很多的实体,这些实体都需要查询聚合根,比如抽离出Get(int id),然后各个Repository继承IRepository的实现,这样各个Repository查询聚合根就会很方便。

另外,你是说的保存数据库会不会有问题?当然没有问题,因为IRepository要具体的实现,实体的Repository在实现的时候,会赋予IAggregateRoot的具体实现,因为每个实体都是由IAggregateRoot继承而来。

 

田园里的蟋蟀 | 园豆:423 (菜鸟二级) | 2016-06-29 14:12

非常感谢!!!!!

让我茅塞顿开

支持(0) 反对(0) 黑白Ketty | 园豆:208 (菜鸟二级) | 2016-06-29 19:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册