• 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();
            }
        }
  • 相关阅读:
    fastapi+vue搭建免费代理IP网站部署至heroku
    如何选择免费代理ip,需要注意哪些指标值和基本参数
    如何部署MongoDB并开启远程访问Docker版
    Linux设置Frps Frpc服务开启启动
    Docker搭建VS Code Server ,设置访问密码随时随地写代码
    薅羊毛须及时 多平台微信线报提醒脚本
    python+selenium实现百度关键词搜索自动化操作
    用python selenium 单窗口单IP刷网站流量脚本
    杂记 内容会在留言中补充
    c#杂记
  • 原文地址:https://www.cnblogs.com/VSMinos/p/9761670.html
Copyright © 2020-2023  润新知