最近用.Net做web项目的时候遇到了一些问题,就是很多的页面的处理一样的,不一样的就是我们写的存储过程不同,为了考虑代码的重复利用和可维护性和可
扩展性,于是写了一个对于单据页面的工厂模式,采用界面的继承技术,因为我们写的ASP.net页面的是代码后置的,所以我们继承的时候就继承我们的后置的代码,也就是我们说的XXXX.aspx.cs文件。其实页面的继承和我们普通的类继承一样,只是ASP.net页面的界面是HTML和后置代码共同组成的,所以也有一些不同,好了先进开始我们的ASP.net页面继承之旅:
我在这里总结了一幅在.net环境下用Rational XDE生成的UML图给大家一个直观感性的认识,我先来讲解一些这副图中的类和它们的关系,BillFactory类是我定义的单据工厂它来识别产生那种单据,VirturBillCOM是一个虚拟类(也可以是接口)它定义了一些方法让继承它的类来实现,IssueBillMng_Frm和IssueBill_Frm是页面的后置代码类,负责页面的一些操作比如,按钮状态,调用业务逻辑等,BillInstorageMngList和IssueBillMng分别继承VirturBillCom虚拟类来实现业务处理调用数据存储层等,BillInstorageMngList负责入库单的处理,IssueBillMng负责出库单的处理。BillEntity和BillItemEntity是数据库映射的实体类。BillInstorageMng继承了页面类IssueBillMng_Frm,BillInstorage继承类页面类IssueBill_Frm,大家可以看到,BillInstorageMng类和BillInstorage类由于继承类页面类,所以他们的类中只有一个空的构造函数,其他的都可以由它的父类处理,在这里大家可能要问,这样就可以完成页面的继承了吗?,呵呵,这只是其中的一步,为了达到和父类的页面显示同样的效果,必须把父类中的HTML拷贝到子类的HTML中,这样界面的显示一样了(如果你要改动一下界面可以在子类界面的HTML中改动添加按钮等),但是有个问题是,在.net设计器中拷贝HTML到子类的页面时,进入该子页面的后置代码的时候会自动的添加页面上的服务器控件在变量声明的地方,我们可以想象,这些控件在父类已经存在了而且默认为保护类型为protected 所以子类也可以看到,所以控件就会重复,就很出错的,必须在子类中把父类已经用的控件变量删除掉,如果子类自己想有其他的操作可以自己加入控件,但变量不能和父类重复。这样很简单就完成了页面的继承,大家可以试试,它可以减少很多的重复的代码。
还有就是我想说的就是BillInstorageMngList类和IssueBillMng类,他们都继承VirturBillCom实现了VirturBillCom定义的函数,他们是中间层,所以我们在页面中调用的时候可以直接调用VirturBillCOM,具体真正的实现哪个实例由BillFactory来实现,这样可能还有不明白的,具体的说在IssueBillMng_Frm的构造函数中(页面的构造函数默认是没有的,我们的自己加)声明一个VirturBillCOM 的实例如:mgrObr = BillFactory(this);用工厂来判断实例那个中间层变量来完成不同的工作。这就是简单工厂模式,大家有不明白的可以看看设计模式。好了今天就说到这,有什么不明白的可以在探讨,虽然我的表达可能有些地方不太清楚,大家可以好好看看这副图,是典型的工厂模式图,好啦该下班回家了。祝大家晚间愉快。