ORM已EF为例子:我见的最多的是泛型的IRepository,
public partial interface IRepository<T> where T : BaseEntity
{
T GetById(object id);
void Insert(T entity);
void Update(T entity);
void Delete(T entity);
IQueryable<T> Table { get; }
}
数据层主要就定义一个这样的接口及对应的实现,然后Services层就通过注入就可以对对应表的(如 IRepository<User>)进行增删改查了。
我现在的问题主要是关于查询的,不同的Services都可能对一个表进行操作,如查询对应ID集合的User,这种方式就会造成不同的Services就有类似的方法 GetUsersByIds(Ilist<int> ids);
我的想法是是不是应该在数据层对每个表建立一个IRepository,如User表建立一个IUserRepository?不过这样开发就很繁琐了~大家有什么看法?第一次写这么长,不知道有没有表述清楚~还望海涵!
参考:ByteartRetail 和 gmframework(郭明峰)的项目
我最近也在整架构,希望能弄出来,以后写博客分享。
/// <summary> /// 定义仓储模型中的数据标准操作 /// </summary> /// <typeparam name="TEntity">动态实体类型</typeparam> /// <typeparam name="TKey">动态实体主键类型</typeparam> public interface IRepository<TEntity, TKey> where TEntity : EntityBase<TKey> { #region 属性 ///// <summary> ///// 获取 当前实体的查询数据集 ///// </summary> //IQueryable<TEntity> Entities { get; } #endregion #region 公共方法 /// <summary> /// 获取数据库实体对象 /// </summary> /// <param name="key">主键值</param> /// <returns>实体对象</returns> TEntity GetByKey(TKey key); /// <summary> /// 插入实体记录 /// </summary> /// <param name="entity"> 实体对象 </param> /// <param name="isSave"> 是否执行保存 </param> /// <returns> 操作影响的行数 </returns> int Insert(TEntity entity, bool isSave = true); /// <summary> /// 批量插入实体记录集合 /// </summary> /// <param name="entities"> 实体记录集合 </param> /// <param name="isSave"> 是否执行保存 </param> /// <returns> 操作影响的行数 </returns> int Insert(IEnumerable<TEntity> entities, bool isSave = true); /// <summary> /// 删除实体记录 /// </summary> /// <param name="entity"> 实体对象 </param> /// <param name="isSave"> 是否执行保存 </param> /// <returns> 操作影响的行数 </returns> int Delete(TEntity entity, bool isSave = true); /// <summary> /// 删除实体记录集合 /// </summary> /// <param name="entities"> 实体记录集合 </param> /// <param name="isSave"> 是否执行保存 </param> /// <returns> 操作影响的行数 </returns> int Delete(IEnumerable<TEntity> entities, bool isSave = true); /// <summary> /// 删除所有符合特定表达式的数据 /// </summary> /// <param name="predicate"> 查询条件谓语表达式 </param> /// <param name="isSave"> 是否执行保存 </param> /// <returns> 操作影响的行数 </returns> int Delete(Expression<Func<TEntity, bool>> predicate, bool isSave = true); /// <summary> /// 更新实体记录 /// </summary> /// <param name="entity"> 实体对象 </param> /// <param name="isSave"> 是否执行保存 </param> /// <returns> 操作影响的行数 </returns> int Update(TEntity entity, bool isSave = true); /// <summary> /// 使用附带新值的实体信息更新指定实体属性的值 /// </summary> /// <param name="propertyExpression">属性表达式</param> /// <param name="isSave">是否执行保存</param> /// <param name="entity">附带新值的实体信息,必须包含主键</param> /// <returns>操作影响的行数</returns> int Update(Expression<Func<TEntity, object>> propertyExpression, TEntity entity, bool isSave = true); #endregion }
嗯!非常感谢~正在看额~
每个表建立一个IRepository是必须的,开发也不会繁琐,我是通过t4读取edmx对象生成的数据访问层接口和实现.然后要添加复杂查询时,使用扩展类扩展这个东西,
挺好的.来就是为了学习