您的位置:首页 > 编程语言 > Java开发

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

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

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



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层代码,请关注。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: