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

 

posted @ 2017-02-12 21:07  石shi  阅读(539)  评论(0)    收藏  举报