DDD里面的实体对象同EF Database First生成的实体有啥区别?
为什么有的例子里面,IRepository<T>,这个T继承子一个基类(例如叫做EntityBase);但是这个EntityBase同EF里自动生成的数据实体不是一个东西。我一直不明白,这样做的话保存到数据库的时候没问题吗。
希望不吝赐教!!!!!
所以有codefirst的概念.
开发的时候完全不要去管数据库怎么.只管对象的格式.
非常感谢!
刚好在做这样的一个项目,我回答一下你的问题:
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继承而来。
非常感谢!!!!!
让我茅塞顿开