ExtJS4.1+MVC3+Spring.NET1.3+EF5 整合五:数据访问层

16 篇文章 0 订阅
15 篇文章 0 订阅

本篇将讲解数据访问接口及实现层代码的编写。数据访问层一般都是原子操作,由于项目较小,涉及到的数据表也很少。

我先把数据访问接口和接口实现上个图,里面只是本篇要说的几个类,其它类以后再实现。

 

1 数据访问接口

这里我根据实际情况抽象出了父接口,对于其他IDao直接继承该接口即可。主要是考虑项目比较简单,这样设计可以简化代码。

但有个问题,虽然Dao依赖于持久层框架(EF或NHibernate),但不应该把这个依赖使IDao接口表现出来,否则Service层也将依赖于持久层框架,显然这种设计不是良好的设计(当然,如果你非要这么做也不是不可以)。所以,IDao不应该与EF框架耦合在一起,这也是我把IDao层所有接口的参数都是string、int等类型的原因,而没有设计成Expression<Func<X,Y>>类型。

1.1 IDao 接口

其中有几处说一下:

A、EnableTrack属性用于启用实体类的状态跟踪。大部分情况下,读取数据是不需要跟踪状态的,但在读取实体后需要维护并持久的情况下就需要启用这个状态。

B、SaveChanages用于持久化操作,把对DbContext中实体类的变化持久化到数据库中。

C、Query方法主要是数据分页的实现。

    public interface IDao<T>
        where T : class
    {
        bool EnableTrack { get; set; }
        int SaveChanges();
        IList<T> Query(string sql, int pageIndex, int pageSize, out int recordCount);
        IList<T> QueryAll();
        bool Exists(string code);
        T Read(string code);
        bool Add(T entity);
        bool Update(T entity);
        bool Delete(T entity);
        bool Delete(string code);
        int DeleteByKeys(IList<string> keys);
    }

这样,其它访问层接口直接继承就可以了,直接上代码:

1.2 IAdminDao接口

    public interface IAdminDao : IDao<Admin>
    { }


1.3 IRoleDao接口:

    public interface IRoleDao : IDao<Role>
    { }

1.4 ICategoryDao接口

根据实际需要,扩展了一个方法:

    public interface ICategoryDao : IDao<Category>
    {
        IList<Category> QueryByParent(string parent);
    }


1.5 IUploadDao 接口

    public interface IUploadDao : IDao<Upload>
    { }

2 数据访问实现类

经过上面接口的定义,现在开始实现这些接口。这里我写了个Repository类,以便处理实体类的原子操作。

这里要注意的是,由于使用了EF5持久层框架,结合上篇编写的DbContext管理类,Dao中获取和创建DbContext都要通过DbContextFactory类来获取。

2.1 Repository类

    public class Repository<T>
        where T : class
    {
        public DbContext DbContext
        {
            get
            {
                return DbContextFactory.GetContext();
            }
        }
        public bool EnableTrack { get; set; }

        public int SaveChanges()
        {
            return this.DbContext.SaveChanges();
        }
        public virtual IList<T> Query(string sql, int pageIndex, int pageSize, out int recordCount)
        {
            var list = EnableTrack
                ? this.DbContext.Set<T>().SqlQuery(sql)
                : this.DbContext.Set<T>().SqlQuery(sql).AsNoTracking();
            recordCount = list.Count();
            return list.Skip(pageIndex * pageSize).Take(pageSize).ToList();
        }
        public virtual IList<T> QueryAll()
        {
            return EnableTrack
                ? this.DbContext.Set<T>().ToList()
                : this.DbContext.Set<T>().AsNoTracking().ToList();
        }
        public virtual IList<T> QueryItems(Expression<Func<T, bool>> predicate)
        {
            return EnableTrack
                ? this.DbContext.Set<T>().Where(predicate).ToList()
                : this.DbContext.Set<T>().AsNoTracking().Where(predicate).ToList();
        }
        protected virtual bool Exists(Expression<Func<T, bool>> predicate)
        {
            return EnableTrack
                ? this.DbContext.Set<T>().Where(predicate).Any()
                : this.DbContext.Set<T>().AsNoTracking().Where(predicate).Any();
        }
        protected virtual T Read(Expression<Func<T, bool>> predicate)
        {
            return EnableTrack
                ? this.DbContext.Set<T>().Single(predicate)
                : this.DbContext.Set<T>().AsNoTracking().Single(predicate);
        }
        public virtual bool Add(T entity)
        {
            this.DbContext.Set<T>().Add(entity);
            return this.DbContext.SaveChanges() > 0;
        }
        public virtual bool Update(T entity)
        {
            this.DbContext.Set<T>().Attach(entity);
            this.DbContext.Entry<T>(entity).State = System.Data.EntityState.Modified;
            return this.DbContext.SaveChanges() > 0;
        }
        public virtual bool Delete(T entity)
        {
            this.DbContext.Set<T>().Remove(entity);
            return this.DbContext.SaveChanges() > 0;
        }
        protected virtual bool Delete(Expression<Func<T, bool>> predicate)
        {
            T entity = this.DbContext.Set<T>().Single(predicate);
            if (entity == null)
                return false;

            this.DbContext.Set<T>().Remove(entity);
            return this.DbContext.SaveChanges() > 0;
        }
        public virtual int DeleteByKeys(IList<string> keys)
        {
            foreach (var key in keys)
            {
                var entity = this.DbContext.Set<T>().Find(key);
                if (entity != null)
                {
                    this.DbContext.Set<T>().Remove(entity);
                }
            }

            return this.DbContext.SaveChanges();
        }
    }


2.2 AdminDao实现类

    public class AdminDao : Repository<Admin>, IAdminDao
    {
        public bool Exists(string code)
        {
            return base.Exists(x => x.Code == code);
        }
        public Admin Read(string code)
        {
            return base.Read(x => x.Code == code);
        }
        public bool Delete(string code)
        {
            return base.Delete(x => x.Code == code);
        }
    }

2.3 RoleDao实现类

与AdminDao类似:

    public class RoleDao : Repository<Role>, IRoleDao
    {
        public bool Exists(string code)
        {
            return base.Exists(x => x.Code == code);
        }
        public Role Read(string code)
        {
            return base.Read(x => x.Code == code);
        }
        public bool Delete(string code)
        {
            return base.Delete(x => x.Code == code);
        }
    }

2.4 CategoryDao实现类

需要另外实现QueryByParent方法:

    public class CategoryDao : Repository<Category>, ICategoryDao
    {
        public bool Exists(string code)
        {
            return base.Exists(x => x.Code == code);
        }
        public Category Read(string code)
        {
            return base.Read(x => x.Code == code);
        }
        public bool Delete(string code)
        {
            return base.Delete(x => x.Code == code);
        }
        public IList<Category> QueryByParent(string parent)
        {
            return string.IsNullOrEmpty(parent)
                    ? base.QueryItems(x => x.ParentCode == null || x.ParentCode == "").OrderBy(x => x.Sort).ToList()
                    : base.QueryItems(x => x.ParentCode == parent).OrderBy(x => x.Sort).ToList();
        }
    }

2.5 UploadDao 实现类

    public class UploadDao : Repository<Upload>, IUploadDao
    {
        public bool Exists(string code)
        {
            return base.Exists(x => x.Code == code);
        }
        public Upload Read(string code)
        {
            return base.Read(x => x.Code == code);
        }
        public bool Delete(string code)
        {
            return base.Delete(x => x.Code == code);
        }
    }


至此,Admin、Role、Category、Upload三个数据访问层已经完成,稍后将编写Service层、Web层代码,以及ExtJS中的MVC相关各类,这样便能搭建一个基础的ExtJS框架了。

下一篇将编写Service层代码,请关注。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值