扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:邹源 来源:作者授权 2007年11月9日
关键字:
六、事务的处理(Transaction)
采用手工处理事务的方式,由于所有的业务层都是Serviced component,因此我们可以直接利用COM+中的事务功能,虽然Serviced component有点性能损耗,但在分布式的结构中还是会带来很多方便的,我将所有的业务层的事务属性设为Required,具体代码如下:
<Description ("Contains methods for inserting and updating product records in the berp system."), Guid ("4FE02C4F-C8FA-497c-9A9E-EDA0877B772C"), Transaction (TransactionOption. Supported), Synchronization (SynchronizationOption.Required), JustInTimeActivation(True)> Public Class Product Public Function Add() As Boolean '………… If ContextUtil.IsInTransaction Then ContextUtil.SetComplete() Else ContextUtil.SetAbort() End If '………… End Function End Class |
系统中的其它层不需要作为Serviced component
七、异常的处理
彻底改变了VB6中的错误处理方式,这点我最喜欢,哈! 项目中的异常分为两种,业务异常和系统异常:
1、业务Exception:
从ApplicationException中继承,有一个总的Exception,然后各个模块的Exception都是从总的Exception中继承,从而形成了一个层次结构:
ApplicationException ProjectException Module1Exception Module1Concret1Exception Module2Concret2Exception …………… Module2Exception …………… |
2、系统异常,报出的错误,包括数据库报出的:
异常捕捉的原则是只捕捉需要的错误,因材在数据访问层和业务层不需要Catch所有的错误,如下:
Public Function Methoda() IF …… THEN If ContextUtil。IsInTransaction Then ContextUtil.etAbort() End If Throw Module1Concret1Exception End If …… Catch 需要的具体的错误Module2Concret1Exception '这里不需要 Catch ProjectException End Function |
为了便于调试,需要把系统异常记录在日志文件中,这里用的MS提供的Exception Management Application Block 来实现的,具体的实现方式见MSDN,下载地址是:
http:www.icrosoft.om/downloads/details.spx?FamilyId=8CA8EB6E-6F4A-43DF-ADEB-8F22CA173E02&displaylang=en
在界面显示错误信息的时候为两种显示方式,一种是用来显示业务异常的,一种界面是用来显示系统异常的,代码如下:
Public Sub Button_OnClick() Dim objblModule As 业务层 Try ObjblModul.osomething() Catch ProjectExcption '显示一个定制的页面() Catch Exception 'call Exception Management. Publish method to log the exception '显示另一个定制的页面,定制的页面有将具体的错误信息发送到administrator的功能,就象windows的错误页面 End Try End Sub |
八、权限控制
这是一个值得深入讨论的问题,我采用的方式是用FORM认证的方法,具体的用户信息,权限是放在数据库中,并没有集成WINDOWS的域认证,实现的时候用专门的层来执行权限判断,利用GeneralPrincipal 和GeneralIdentity对象 ,代码片段如下:
Public Function CheckRole(ByVal strRole As String) As Boolean Return privateUserPrincipal.IsInRole(strRole) End Function Private Sub InitPrincipal() Try privateUserIdentity = New GenericIdentity(privateUserName) privateUserPrincipal = New GenericPrincipal(privateUserIdentity, privateUserRoles) Catch e As Exception Throw New Exception("an error occurred setting credentials") End Try End Sub Private Sub SavePrincipal() Try If Not IsNothing(_context) Then context.Session("UserName") = privateUserIdentity.Name context.Session("Roles") = privateUserRoles context.User = privateUserPrincipal End If Catch e As Exception Throw e End Try End Sub |
这样一来当界面变成WINDOWS的FORM是就不需要改动很多代码了,同时为了解决将权限放到SESSION中引起的延时问题,我将用户的权限信息放在服务端的XML文件中,然后直接中XML文件中获得数据,任何对用户信息的修改都将改变相应的XML文件,这样效率高于从数据库获得。
当然在实际开发中还会碰到很多其他问题,如报表,打印,并发性等,如果大家有兴趣可以和我联系,限于个人水平有不足之处请多多包含。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者