# 从二层到三层,获得更强大的能力,更好的伸缩性

前面学习的都是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
1
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()
1

DoDelete方法

This.Dal_Employees.Delete()
1

D oSave方法

If Thisform.Oca.Save()
   Return .T.
Else
   Return .F.
Endif
1
2
3
4
5

DoUndo方法

If Thisform.Oca.Undo()>=0
   Return .T.
Else
   Return .F.
Endif
1
2
3
4
5

代码量也很非常少的,跟二层的方式没什么大的区别. 把雇员列表复制一份,改名叫雇员列表2,并清除原来的代码.现在来将BLL层绑定表单中

添加按钮Click方法

Thisform.oDe.New()
Thisform.Refresh()
1
2

删除按钮Click方法

thisform.oDe.delete()
1

保存按钮Click方法

If Thisform.oDe.Save()
   Wait "保存成功" Windows
Else
   Wait "保存失败"  Windows
Endif
1
2
3
4
5

撤消按钮Click方法

If Thisform.oDe.Undo()>=0
   Wait "撤消成功" Windows
Endif
1
2
3

执行表单,运行效果跟6A节的效果是一模一样的,也拥有编辑内容后,提示保存的功能.