【Design】封装BaseDal基类

建立简单的模型

现在编写用户信息数据库访问层UserInfoDal

public class UserInfoDal
{
    DataModelContainer db = new DataModelContainer();

    /// <summary>
    /// 添加用户信息
    /// </summary>
    public UserInfo Add(UserInfo userInfo)
    {
        db.UserInfo.Add(userInfo);
        db.SaveChanges();
        return userInfo;
    }

    /// <summary>
    /// 修改用户信息
    /// </summary>
    public bool Update(UserInfo userInfo)
    {
        db.Entry(userInfo).State = EntityState.Modified;
        return db.SaveChanges() > 0;
    }

    /// <summary>
    /// 删除用户信息
    /// </summary>
    public bool Delete(UserInfo userInfo)
    {
        db.Entry(userInfo).State = EntityState.Deleted;
        return db.SaveChanges() > 0;
    }

    /// <summary>
    /// 通过参数获取用户信息
    /// </summary>
    public IQueryable<UserInfo> GetUsers(Expression<Func<UserInfo, bool>> whereLambda)
    {
        return db.UserInfo.Where(whereLambda).AsQueryable();
    }

    /// <summary>
    /// 分页
    /// </summary>
    /// <typeparam name="S">排序对象</typeparam>
    /// <param name="pageSize">页数据个数</param>
    /// <param name="pageIndex">页码</param>
    /// <param name="total">数据总量</param>
    /// <param name="whereLambda">条件参数</param>
    /// <param name="orderByLambda">排序参数</param>
    /// <param name="isAsc">是否升序</param>
    /// <returns></returns>
    public IQueryable<UserInfo> GetPageUsers<S>(int pageSize, int pageIndex, out int total,
        Expression<Func<UserInfo, bool>> whereLambda,
        Expression<Func<UserInfo, S>> orderByLambda,
        bool isAsc)
    {
        total = db.UserInfo.Where(whereLambda).Count();

        if (isAsc)
        {
            var temp = db.UserInfo.Where(whereLambda)
                .OrderBy(orderByLambda)
                .Skip(pageSize * (pageIndex - 1))
                .Take(pageSize).AsQueryable();
            return temp;
        }
        else
        {
            var temp = db.UserInfo.Where(whereLambda)
            .OrderByDescending(orderByLambda)
            .Skip(pageSize * (pageIndex - 1))
            .Take(pageSize).AsQueryable();
            return temp;
        }

    }

}

编写完用户信息的业务逻辑,还要编写订单信息OrderInfoDal,发现内部逻辑很相似

这时候,我们就要考虑设计了,可以编写基类

 

BaseDal基类

都是实体的增删改查,我们可以传一个泛型参数进去即可

public class BaseDal<T> where T : class, new()
{
    DataModelContainer db = new DataModelContainer();

    /// <summary>
    /// 添加
    /// </summary>
    public T Add(T entity)
    {
        db.Set<T>().Add(entity);
        db.SaveChanges();
        return entity;
    }

    /// <summary>
    /// 修改
    /// </summary>
    public bool Update(T entity)
    {
        db.Entry(entity).State = EntityState.Modified;
        return db.SaveChanges() > 0;
    }

    /// <summary>
    /// 删除
    /// </summary>
    public bool Delete(T entity)
    {
        db.Entry(entity).State = EntityState.Deleted;
        return db.SaveChanges() > 0;
    }

    /// <summary>
    /// 通过参数获取信息
    /// </summary>
    public IQueryable<T> GetEntities(Expression<Func<T, bool>> whereLambda)
    {
        return db.Set<T>().Where(whereLambda).AsQueryable();
    }

    /// <summary>
    /// 分页
    /// </summary>
    /// <typeparam name="S">排序对象</typeparam>
    /// <param name="pageSize">页数据个数</param>
    /// <param name="pageIndex">页码</param>
    /// <param name="total">数据总量</param>
    /// <param name="whereLambda">条件参数</param>
    /// <param name="orderByLambda">排序参数</param>
    /// <param name="isAsc">是否升序</param>
    /// <returns></returns>
    public IQueryable<T> GetPageEntities<S>(int pageSize, int pageIndex, out int total,
        Expression<Func<T, bool>> whereLambda,
        Expression<Func<T, S>> orderByLambda,
        bool isAsc)
    {
        total = db.Set<T>().Where(whereLambda).Count();

        if (isAsc)
        {
            var temp = db.Set<T>().Where(whereLambda)
                .OrderBy(orderByLambda)
                .Skip(pageSize * (pageIndex - 1))
                .Take(pageSize).AsQueryable();
            total = temp.Count();
            return temp;
        }
        else
        {
            var temp = db.Set<T>().Where(whereLambda)
            .OrderByDescending(orderByLambda)
            .Skip(pageSize * (pageIndex - 1))
            .Take(pageSize).AsQueryable();
            total = temp.Count();
            return temp;
        }

    }
}

对UserInfoDal,OrderInfoDal类进行修改

UserInfoDal

public class UserInfoDal : BaseDal<UserInfo>
{

}

OrderInfoDal

public class OrderInfoDal : BaseDal<OrderInfo>
{
}

这样的设计就很好了,每一个Dal都继承BaseDal就好了

相关推荐
课程通过实际项目融入常用开发技术架构,讲授风格独特,提供详细上课日志及答疑,赠送配套的项目架构源码注释详细清晰且表达通俗,均能直接在实际项目中应用,正真的物超所值,价格实惠 任务作业: 综合运用《C#/.Net企业级系统架构设计实战精讲教程》课程所学知识技能设计一个学生成绩管理系统的架构。要求: 1.系统基于MVC的三层架构,各层单独建不同的解决方案文件夹。 2.采用Model First开发方式,设计架构时只需要设计学生表(TbStudent)和课程表(TbCourse)。学生表必须有的字段是ID、stuName、age;课程表必须有的字段是ID、courseName、content。 3.数据访问层采用Entity Framework或NHibernate来实现,必须封装对上述表的增删改查方法。 4.必须依赖接口编程,也就是必须要有数据访问层的接口层、业务逻辑层的接口层等接口层。层层之间必须减少依赖,可以通过简单工厂或抽象工厂。 5.至少采用简单工厂、抽象工厂、Spring.Net等技术中的2种来减少层与层之间的依赖等。 6.封装出DbSession类,让它拥有所有Dal层实例和SaveChanges方法。 7.设计出数据访问层及业务逻辑层主要类的T4模板,以便实体增加时自动生成相应的类。 8.表现层要设计相关的控制器和视图来验证设计的系统架构代码的正确性,必须含有验证增删改查的方法。 9.开发平台一定要是Visual Studio平台,采用C#开发语言,数据库为SQL Server。 10.提交整个系统架构的源文件及生成的数据库文件。 (注意: 作业需写在CSDN博客中,请把作业链接贴在评论区,老师会定期逐个批改~~)
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页