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(); } }
上一篇: upload-labs第一关
下一篇: 鄢陵美食之大豆腐脑儿
推荐阅读
-
MVC项目结构搭建及单个类的实现学习笔记1
-
ASP.NET MVC项目实现BasePage基类用作ASPX.CS网页继承
-
ASP.NET MVC项目中App_Code目录在程序应用
-
asp.net mvc项目使用spring.net发布到IIS后,在访问提示错误 Could not load type from string value 'DALMsSql.DBSessionFactory,DALMsSql'.
-
把ASP.NET MVC项目部署到本地IIS上的完整步骤
-
ASP.Net MVC OA项目笔记<四>
-
学习ASP.NET MVC5框架揭秘笔记-ASP.NET MVC路由(三)
-
ASP.NET Core 2 学习笔记(六)
-
使用Asp.Net Core MVC 开发项目实践[第一篇:项目结构说明]
-
ASP.Net MVC OA项目笔记<二>