zoukankan      html  css  js  c++  java
  • ASP.Net MVC OA项目笔记<六>

    1.1.1 开始写业务,先写业务的实现再写业务的接口

             业务类中也是有写增删改查公用的方法

             引用Model,IDAL,DALFactory

             BLL添加两个类 UserInfoService,BaseService,并让UserInfoService继承BaseService

    1.2.1 业务层要调用DBSession,所以要把DBSession给new出来

             每一个业务子类都要通过DBSession来调用具体的数据操作类,如果把DBSession创建在每个业务子类中就存在重复性了,所以放在基类里面

    1.2.2 完成了业务成调DBSession后,把业务层的增删改查方法也放的业务的基类里面

             试着把IBaseDal的过滤查询方法复制过来

             用CurrentDBSession调用数据

           1.CurrentDBSession :创建DBSession对象

           2.UserInfoDal:DBSession类中通过反射创建实例

          3.LoadEntities:UserInfoDal实例继承=>IUserInfoDal接口,但是IUserInfoDal接口继承=>IBaseDal接口

                                 所以UserInfoDal可以调用IBaseDal接口中的方法

    1.2.3 但是BaseService是个基类,根本不知道要通过DBSession操作那个数据的实例,不能直接调用UserInfoDal,子类才可以这样调,所以不能这样写

             1.可以把父类改成抽象类

            2.加一个抽象方法

            3.然后定义一个构造方法,在构造方法中把抽象方法调一次

               因为子类继承父类,也会继承父类的构造方法,所以子类在创建对象时,就会先调用一次这个构造方法,执行里面的抽象方法

            3.然后定义一个公共属性

    1.2.4 实现子类的抽象类

             1.CurrentDal:公共属性,类型是IBaseDal,子类可以拿到父类的CurrentDal,拿到父类DBSession属性的实例

             2.this:子类

             3.CurrntDBsession:在父类定义的,可以拿到父类的DBSession属性

             4..UserInfoDal:调该子类(UserInfoService)的数据操作实例(UserInfoDal),UserInfoDal实现了自己的接口IUserInfoDal,IUserInfoDal又继承了IBaseDal

    1.2.5 多态

             父类中不知道通过DBSession获取哪个子类的实例,但是子类知道

             UserInfoService通过DBSession获取的肯定是UserInfoDal

             所以把这个业务基类BaseService改成抽象类 ,加一个抽象方法,并且把这个抽象方法放在基类的构造方法里面,让他创建时调用一次

             而且表现层调用业务类,表现层把这个业务类一new的话,它继承的构造方法就会就会执行,构造方法一执行,就执行子类的抽象方法

             表现层=>new UserInfoService=>执行父类构造方法=>执行子类抽象方法SetCurrentDal( )=>拿到子类的数据实例UserInfoDal赋值给公共属性CurrentDal

             这时候就可以通过CurrentDal.LoadEntities( )拿到UserInfo的查询数据了

     

     1.2.6 代码

         //在基类中完成DBSession的调用,然后将业务层中公共的方法定义在基类中,但这些方法不知道通过DBSession来获取哪个数据操作类的实例。
        //所以将该业务基类定义成抽象类,加上一个抽象方法,加上一个IBaseDal属性,并让基类的构造方法调用抽象方法目的是在表现层new具体的
        //业务子类,父类的构造方法被调用,这时执行抽象方法,但是执行的是子类中具体的实现。业务子类知道通过DBSession获取哪个数据操作类的实例。
        public abstract class BaseService<T> where T : class, new()
        {
            public IDBSession CurrentDBSession
            {
                get
                {
                    return new DBSession();//暂时这么写
                }
            }
            public IBaseDal<T> CurrentDal { get; set; }//公共属性
            public abstract void SetCurrentDal();//抽象方法
            public BaseService()//构造函数
            {
                SetCurrentDal();//子类一定要实现抽象方法
            }
          
            public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda)
            {
               return  CurrentDal.LoadEntities(whereLambda);
            }
        }
     public class UserInfoService : BaseService<UserInfo>
        {
            public override void SetCurrentDal()
            {
                CurrentDal = this.CurrentDBSession.UserInfoDal;
            }
        }

    1.3.1 表现层加控制器,调试一下

             1.表现层加个控制器,叫UserInfoControl

             2.右键=>添加=>控制器

    1.4.1给WebApp引入BLL和Model

    1.4.2 表现层调业务层的查询方法

             1.当用户在地址栏里面输了UserInfo这个控制器的Index方法时,先new,子类的构造方法先执行=>父类的构造方法肯定执行=>

                一执行调它的抽象方法SetCurrentDal()=>一调抽象方法先调子类的抽象方法=>执行子类的抽象方法=>子类可以拿到父类的DBSession属性=>

                通过它调UserInfoDal=>把UserInfoDal的实例拿给父类的CurrentDal(在父类定义)=>为什么把CurrentDal类型赋为IBaseDal=>

                因为所有的数据操作类都实现了自己的接口,并且每一个接口都继承了IBaseDal=>这个流程走完了,就表示这个bll对象被new出来了=>

                接着走Index()方法=>调父类业务层的方法LoadEntities=>CurrentDal有值(UserInfoDal)=>调UserInfoDal中的LoadEntities(查询方法)

    1.5.1 把业务层的基类都封装好(其他增删改查方法都补上)

     //在基类中完成DBSession的调用,然后将业务层中公共的方法定义在基类中,但这些方法不知道通过DBSession来获取哪个数据操作类的实例。
        //所以将该业务基类定义成抽象类,加上一个抽象方法,加上一个IBaseDal属性,并让基类的构造方法调用抽象方法目的是在表现层new具体的
        //业务子类,父类的构造方法被调用,这时执行抽象方法,但是执行的是子类中具体的实现。业务子类知道通过DBSession获取哪个数据操作类的实例。
        public abstract class BaseService<T> where T : class, new()
        {
            public IDBSession CurrentDBSession
            {
                get
                {
                    return new DBSession();//暂时这么写
                }
            }
            public IBaseDal<T> CurrentDal { get; set; }//公共属性
            public abstract void SetCurrentDal();//抽象方法
            public BaseService()//构造函数
            {
                SetCurrentDal();//子类一定要实现抽象方法
            }
    
            //查询过滤
            public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda)
            {
                return CurrentDal.LoadEntities(whereLambda);
            }
            //分页
            public IQueryable<T> PageLoadEntities<s>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> whereLambda, Expression<Func<T, s>> orderbyLambda, bool isAsc)
            {
                return CurrentDal.PageLoadEntities<s>(pageIndex, pageSize, out totalCount, whereLambda, orderbyLambda, isAsc);
            }
            //新增
            public T AddEntity(T entity)
            {
                CurrentDal.AddEntity(entity);
                CurrentDBSession.SaveChanges();//保存
                return entity;
    
            }
            //删除
            public bool DeleteEntity(T entity)
            {
                CurrentDal.DeleteEntity(entity);
                return CurrentDBSession.SaveChanges();
            }
            //编辑
            public bool EditEntity(T entity)
            {
                CurrentDal.EditEntity(entity);
                return CurrentDBSession.SaveChanges();
            }
        }

    1.6.1 表现层调业务层也是调接口,这一段改成接口的类型,所以需要给它新增接口

    1.6.2 新增接口 IUserInfoService,IBaseService

             IBLL引用Model,IDAL

             让IUserInfoService继承IBaseService

     public interface IBaseService<T> where T : class, new()
        {
            IDBSession CurrentDBSession { get; }
            IBaseDal<T> CurrentDal { get; set; }
            IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda);
            IQueryable<T> PageLoadEntities<s>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> whereLambda, Expression<Func<T, s>> orderbyLambda, bool isAsc);
            T AddEntity(T entity);
            bool DeleteEntity(T entity);
            bool EditEntity(T entity);
    
        }
     public interface IUserInfoService:IBaseService<UserInfo>
        {
       
        }

    1.7.1 业务层BLL引用IBLL

             具体业务类UserInfoService 要继承IUserInfoService

      public class UserInfoService : BaseService<UserInfo>,IUserInfoService
        {
            public override void SetCurrentDal()
            {
                CurrentDal = this.CurrentDBSession.UserInfoDal;
            }
        }

     1.8.1 WebApp引入IBLL

              这里bll改成接口类型, 重新生成下解决方案

              

     public class UserInfoController : Controller
        {
            // GET: UserInfo
            IBLL.IUserInfoService bll = new BLL.UserInfoService();
            public ActionResult Index()
            {
                //表现层调业务层的查询方法,里面放一个lambda表达式
                bll.LoadEntities(c=>c.ID==2);
                return View();
            }
        }

    1.8.2 如果要添加

    1.8.3 如果是非常复杂的业务,就要再IUserInfoService中再写一个新的复杂的方法,表现层调用这个复杂的方法运算

            CurrentDBSession 要保证线程的唯一, 这样用的就是同一个DBSession,所以其实只new了一次

     1.8.4  CurrentDBSession线程的唯一

               给DALFactory添加一个类DBSessionFactory

     public class DBSessionFactory
        {
            public static IDBSession CreateDBSession()
            {
                IDBSession DbSession = (IDBSession)CallContext.GetData("dbSession");
                if(DbSession==null)
                {
                    DbSession = new DBSession();
                    CallContext.SetData("dbSession", DbSession);
                }
                return DbSession;
            }
        }

    1.8.5 把BaseService 中获取DBSession的方法改了

     //在基类中完成DBSession的调用,然后将业务层中公共的方法定义在基类中,但这些方法不知道通过DBSession来获取哪个数据操作类的实例。
        //所以将该业务基类定义成抽象类,加上一个抽象方法,加上一个IBaseDal属性,并让基类的构造方法调用抽象方法目的是在表现层new具体的
        //业务子类,父类的构造方法被调用,这时执行抽象方法,但是执行的是子类中具体的实现。业务子类知道通过DBSession获取哪个数据操作类的实例。
        public abstract class BaseService<T> where T : class, new()
        {
            public IDBSession CurrentDBSession
            {
                get
                {
                    //return new DBSession();//暂时这么写
                    return DBSessionFactory.CreateDBSession();
                }
            }
            public IBaseDal<T> CurrentDal { get; set; }//公共属性
            public abstract void SetCurrentDal();//抽象方法
            public BaseService()//构造函数
            {
                SetCurrentDal();//子类一定要实现抽象方法
            }
    
            //查询过滤
            public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda)
            {
                return CurrentDal.LoadEntities(whereLambda);
            }
            //分页
            public IQueryable<T> PageLoadEntities<s>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> whereLambda, Expression<Func<T, s>> orderbyLambda, bool isAsc)
            {
                return CurrentDal.PageLoadEntities<s>(pageIndex, pageSize, out totalCount, whereLambda, orderbyLambda, isAsc);
            }
            //新增
            public T AddEntity(T entity)
            {
                CurrentDal.AddEntity(entity);
                CurrentDBSession.SaveChanges();//保存
                return entity;
    
            }
            //删除
            public bool DeleteEntity(T entity)
            {
                CurrentDal.DeleteEntity(entity);
                return CurrentDBSession.SaveChanges();
            }
            //编辑
            public bool EditEntity(T entity)
            {
                CurrentDal.EditEntity(entity);
                return CurrentDBSession.SaveChanges();
            }
        }
  • 相关阅读:
    C++中使用多线程
    hdu 4223 dp 求连续子序列的和的绝对值最小值
    hdu 1372 bfs 计算起点到终点的距离
    hdu 4217 线段树 依次取第几个最小值,求其sum
    心得
    hdu 1175 bfs 按要求进行搜索,是否能到达,抵消两个(相同)棋子
    hdu 4221 greed 注意范围 工作延期,使整个工作时间罚时最少的单个罚时最长的值
    hdu 2844 多重背包 多种硬币,每一种硬币有一点数量,看他能组成多少种钱
    uva LCDDisplay
    hdu 4218 模拟 根据一个圆点和半径画一个圆 注意半径要求
  • 原文地址:https://www.cnblogs.com/VSMinos/p/9761670.html
Copyright © 2011-2022 走看看