首页 新闻 赞助 找找看

大家来探讨下,IRepository 应该怎么定义?

0
悬赏园豆:20 [已解决问题] 解决于 2014-04-16 23:18

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?不过这样开发就很繁琐了~大家有什么看法?第一次写这么长,不知道有没有表述清楚~还望海涵!

突击小兵的主页 突击小兵 | 初学一级 | 园豆:135
提问于:2014-04-15 09:55
< >
分享
最佳答案
0

参考:ByteartRetail  和 gmframework(郭明峰)的项目

收获园豆:15
滴答的雨 | 老鸟四级 |园豆:3681 | 2014-04-15 14:05

我最近也在整架构,希望能弄出来,以后写博客分享。

    /// <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
    }

 

 

滴答的雨 | 园豆:3681 (老鸟四级) | 2014-04-15 14:08

  嗯!非常感谢~正在看额~

突击小兵 | 园豆:135 (初学一级) | 2014-04-16 23:17
其他回答(2)
0

每个表建立一个IRepository是必须的,开发也不会繁琐,我是通过t4读取edmx对象生成的数据访问层接口和实现.然后要添加复杂查询时,使用扩展类扩展这个东西,

收获园豆:5
吴瑞祥 | 园豆:29449 (高人七级) | 2014-04-15 10:07
0

挺好的.来就是为了学习

[大师兄] | 园豆:64 (初学一级) | 2015-06-20 00:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册