DbSession的作用:
1.拥有所有Dal的实例。
2.SaveChange()把实体进行一次整体的提交
public class DbSession
{
public IUserInfoDal UserInfoDal
{
get
{
return StaticDalFactory.GetUserInfoDal();
}
}
public IOrderInfoDal OrderInfoDal {
get
{
return StaticDalFactory.GetOrderInfoDal();
}
}
/// <summary>
/// 拿到当前的EF的上下文,然后进行 把修改实体进行一个整体提交。
/// </summary>
/// <returns></returns>
public int SaveChanges()
{
return DbContextFactory.GetCurrentDbContext().SaveChanges();
}
}
IDbSession的代码:
public interface IDbSession
{
IUserInfoDal UserInfoDal { get; }
IOrderInfoDal OrderInfoDal { get; }
int SaveChanges();
}
DbContextFactory的GetCurrentDbContext方法:
public class DbContextFactory
{
public static DbContext GetCurrentDbContext()
{
//一次请求共用一个实例
DbContext db = CallContext.GetData("DbContext") as DbContext;
if (db == null)
{
db = new DataModelContainer();
CallContext.SetData("DbContext", db);
}
return db;
}
}
DbSessionFactory的封装:
/// <summary>
/// 一次请求共用一个DbSession实例
/// </summary>
public class DbSessionFactory
{
public static IDbSession GetCurrentDbSession()
{
IDbSession db = CallContext.GetData("DbSession") as IDbSession;
if (db == null)
{
db = new DbSession();
CallContext.SetData("DbSession", db);
}
return db;
}
}
在UserInfoService中通过工厂模式获取Session:
//通过工厂模式获取Session
private IDbSession dbSession = DbSessionFactory.GetCurrentDbSession();
BaseService的方法:
/// <summary>
/// 父类要逼迫自己给父类的一个属性赋值 赋值的操作必须在父类的方法调用之前执行
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class BaseService<T> where T:class ,new()
{
public IBaseDal<T> CurrentDal { get; set; }
/// <summary>
/// DbSession 做成属性
/// </summary>
public IDbSession DbSession
{
get { return DbSessionFactory.GetCurrentDbSession(); }
}
/// <summary>
/// 基类的构造函数
/// </summary>
public BaseService()
{
//调用了抽象方法
SetCurrentDal();
}
//抽象方法:要求子类必须实现抽象方法,对此方法进行重写
public abstract void SetCurrentDal();
/// <summary>
/// 用到的时候在去查询 IQueryable 转换成 Queryable 集合 取代上面的方法
/// </summary>
/// <param name="?"></param>
/// <returns></returns>
public IQueryable<T> GetEntites(Expression<Func<T, bool>> whereLambda)
{
return CurrentDal.GetEntites(whereLambda);
}
/// <summary>
/// 分页的语句
/// </summary>
/// <param name="pageSize"></param>
/// <param name="pageIndex"></param>
/// <param name="total"></param>
/// <param name="whereLambda"></param>
/// <returns></returns>
public IQueryable<T> GetPageEntites<S>(int pageSize, int pageIndex, out int total,
Expression<Func<T, bool>> whereLambda,
Expression<Func<T, S>> orderByLambda,
bool isAsc)
{
return CurrentDal.GetPageEntites(pageSize, pageIndex, out total, whereLambda, orderByLambda, isAsc);
}
/// <summary>
/// 增加
/// </summary>
/// <param name="T"></param>
/// <returns></returns>
public T Add(T entity)
{
CurrentDal.Add(entity);
DbSession.SaveChanges();
return entity;
}
/// <summary>
/// 修改
/// </summary>
/// <param name="T"></param>
/// <returns></returns>
public bool Update(T entity)
{
CurrentDal.Update(entity);
return DbSession.SaveChanges() > 0;
}
/// <summary>
/// 删除
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public bool Delete(T entity)
{
CurrentDal.Delete(entity);
return DbSession.SaveChanges() > 0;
}
}
UserInfoService的方法:
public class UserInfoService:BaseService<UserInfo>
{
public override void SetCurrentDal()
{
CurrentDal = this.DbSession.UserInfoDal;
}
}
OrderInfoService 的方法:
public class OrderInfoService:BaseService<OrderInfo>
{
/// <summary>
/// 赋值给当前的Dal
/// </summary>
public override void SetCurrentDal()
{
CurrentDal = DbSession.OrderInfoDal;
}
}