因为不同的表产生不同的数据实体,但是Richard还想使得AddSingleDataEntity这个方法可以接受任何的数据实体,所以此时很有必要对数据实体进行抽象。所以Richard想到了定义一个接口:IDataEntity,打算让所有通过ORM生成的数据实体都继承这个接口。而且 Richard还想到:
1.如果BLL直接引用DAL使用的,那么IDataEntity可能会在BLL中出现的。
2.如果BLL通过repository去DAL中获取数据,那么到时候BLL可能都不会直接引用DAL,但是BLL最终还是得使用数据做事情,所以IDataEntity还是会在BLL中出现,所以,IDataEntity接口最好定义在一个公共的地方。
Richard决定新建一个Common的类库,加入IDataEntity接口的定义,现在这个接口里面什么都没有,只是一个标记而已,表明继承这个接口的类就是数据实体类。
AddSingleDataEntity(IDataEntity dataEntity);
还有一点就是尽量的使用类型安全的方法,于是Richard把方法改成了范型方法:
AddSingleDataEntity<T>(T dataEntity) where T:IDataEntity,class,new();
至于T 的那些约束:T:IDataEntity,class,new(),是考虑到了Linq和EF中对数据实体的一些要求。
一般的Add方法都是返回添加是否成功,true或者false,方法再次改造:
bool AddSingleDataEntity<T>(T dataEntity) where T:IDataEntity,class,new();
然后Richard就写出了上面列出的一些方法的定义:
bool AddSingleDataEntity<T>(T dataEntity) where T : class,IDataEntity, new();
bool AddDataEntityList<T>(List<T> dataEntityList) where T : class,IDataEntity, new();
bool DeleteDataEntityList<T>(List<T> dataEntityList) where T : class,IDataEntity, new();
bool DeleteSingleDataEntity<T>(T dataEntity) where T : class,IDataEntity, new();
bool UpdateSingleDataEntity<T>(T dataEntity) where T : class,IDataEntity, new();
bool UpdateDataEntityList<T>(List<T> dataEntityList) where T : class,IDataEntity, new();
至于GetDataEntityList,按照之前的查询对象的想法,传入一个IQuery的接口:
List<T> GetDataEntityList<T>(IQuery query)where T : class,IDataEntity, new();
2.对基本的操作的进一步的思考
确实,上面那些基本操作是没有什么问题的,现在Richard又考虑到了另外的一些问题,还是以AddSingleDataEntity方法为例:
a.有些时候,不仅仅要知道插入数据是否成功,而且还想返回新加入数据在数据库中的主键信息来做其他的用途。怎么办?再来查询一次?