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层代码,请关注。
- ExtJS4.1+MVC3+Spring.NET1.3+EF5 整合五:数据访问层
- ExtJS4.1+MVC3+Spring.NET1.3+EF5 整合三:EF构建持久层
- ExtJS4.1+MVC3+Spring.NET1.3+EF5 整合六:业务逻辑层
- ExtJS4.1+MVC3+Spring.NET1.3+EF5 整合一:构建项目框架
- ExtJS4.1+MVC3+Spring.NET1.3+EF5 整合二:生成数据库
- ExtJS4.1+MVC3+Spring.NET1.3+EF5 整合四:DbContext生命周期
- ExtJS4.1+MVC3+Spring.NET1.3+EF5 整合七:数据传输对象
- ExtJS4.1+MVC3+Spring.NET1.3+EF5 整合八:ExtJS及其MVC
- ExtJS4.1+MVC3+Spring.NET1.3+EF5 整合九:搭建布局结构
- ExtJS4.1+MVC3+Spring.NET1.3+EF5 整合十:TreePanel 之 管理菜单
- GoldArch0.1(spring.net1.3)数据访问框架
- ASP.NET MVC4 中整合 NHibernate3.3、Spring.NET2.0、ExtJS4 笔记五:ExtJS4.0整合
- extjs4,spring mvc3上传文件
- Spring 整合数据访问技术
- 数据访问层3
- Spring学习笔记 五 整合hibernate持久层 ----1,基本配置
- 4、spring-boot 整合数据访问
- EF5 通用数据层 增删改查操作,泛型类
- 一个导航条的进化
- 冒泡法排序
- 毕设v0.1完成,CC2530实现燃气报警。
- 几个小算法练习
- Linux 查看corefile文件所在路径
- ExtJS4.1+MVC3+Spring.NET1.3+EF5 整合五:数据访问层
- java零碎要点---1.JAVA邮件发送的简单实现
- 2012年图灵奖获得者及他们的主要贡献
- How to call Matlab function in C++
- 我的DIY Android之旅--Android2.3源码初识
- 分享下.NET程序读取二代身份证(附源码
- Windows7下硬盘安装Mac OS X Lion(狮子)10.7正式版
- smackx jingle语音通话实例
- 理解面向对象