0
点赞
收藏
分享

微信扫一扫

OA项目线程内共享上下文实例(二)

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;
}
}

 



举报

相关推荐

0 条评论