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

来源:互联网 发布:如何建立网络共享 编辑:程序博客网 时间:2024/04/28 19:06

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

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

 

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层代码,请关注。

原创粉丝点击