# 从二层到三层,获得更强大的能力,更好的伸缩性
前面学习的都是UI层直接搭配DAL层.现在来学习一下UI+BLL+DAL三层的开发方式.
BLL层适用于父子表及多表操作,当然,单表操作也可以,二层,三层,哪种开发方式有利就采用哪种.
BLL层包装了多表的事务,封装了多表的新增,修改,删除,保存,撤消等方法.实现了权限类的即插即用.(关于权限类,参考后面的文章)
将上一篇文章的UI+DAL的方式,升级为UL+BLL+DAL层的方式
首先如图所示,创建一个BLL类(由数据环境类实现)
创建成功之后, 如图所示,我就可以在BLL层类的Init事件中添加实例化方法了,它会先于表单的Init事件前发生.
Init方法添下如下代码
This.Newobject("Dal_Employees","Dal_Employees","Dal_Employees_ca.prg")
If !This.Dal_Employees.CursorFill(.T.) &&加载数据
Aerror(laerror)
Messagebox(laerror(2))
Return 0
Endif
2
3
4
5
6
你会发现6节的代码几乎是一样的.只不过,Newobject命令由BLL类的Newobject方法所代替了.第一个参数在BLL类中存放的Dal类的实例名,可以通过它来引用你的DAL实例. bll层内置了四个操作方法New 新增 Edit 修改 Delete 删除 Undo 撤消 Save保存 ,五个导航方法 Go GOTOP GONEXT GOPROE GOEND 因为业务逻辑是非常多变的,几乎没有完全相同的业务逻辑,故BLL层存放了命名叫DoAdd,DoSave的方法, 这些方法是扩展勾子方法,就是实际需要用户补充的操作代码. 比如调用Save()方法,实际业务逻辑执行的是DoSave()方法,所以,这些开发方式跟原来的面向过程很不一样,我也可能表述得不是很理想,希望后期能加以改进.
默认方法 | 用户扩展勾子方法 | 备注 |
---|---|---|
New | DoAdd | 勾子方法不能被直接调用 |
Edit | DoEdit | 勾子方法不能被直接调用 |
Delete | doDelete | 勾子方法不能被直接调用 |
Undo | DoUndo | 勾子方法不能被直接调用 |
Save | DoSave | 勾子方法不能被直接调用 |
现在来编写业务逻辑了 DoAdd方法
This.Dal_Employees.Add()
DoDelete方法
This.Dal_Employees.Delete()
D oSave方法
If Thisform.Oca.Save()
Return .T.
Else
Return .F.
Endif
2
3
4
5
DoUndo方法
If Thisform.Oca.Undo()>=0
Return .T.
Else
Return .F.
Endif
2
3
4
5
代码量也很非常少的,跟二层的方式没什么大的区别. 把雇员列表复制一份,改名叫雇员列表2,并清除原来的代码.现在来将BLL层绑定表单中
添加按钮Click方法
Thisform.oDe.New()
Thisform.Refresh()
2
删除按钮Click方法
thisform.oDe.delete()
保存按钮Click方法
If Thisform.oDe.Save()
Wait "保存成功" Windows
Else
Wait "保存失败" Windows
Endif
2
3
4
5
撤消按钮Click方法
If Thisform.oDe.Undo()>=0
Wait "撤消成功" Windows
Endif
2
3
执行表单,运行效果跟6A节的效果是一模一样的,也拥有编辑内容后,提示保存的功能.