[原创]关于多层设计想到的问题-涉及Nhibernate和Log4Net
请先看一下我的分层结构
DataAccess:数据访问层
BusinessEntity:业务实体层
BusinessRule:业务逻辑层
WebUI:表示层
WebUIController:表示层组件控制
SystemFramework:本系统框架
所遇到的问题以及解决方法我会相应地写出来
1。不能把CRUD作为单独的事务处理封装在DataAccess层,因为只有BusinessRule层才有权力决定那些操作构成一个事务。但是NHibernate又建议每次操作必须要使用事务,这很矛盾。我想到的解决办法是在dataAccess层预留两个接口供BusinessRule去调用——BeginTransaction和CommitTransaction,而Rollback的操作是在DataAccess层自动处理的,BusinessRule层不用理会。这样BusinessRule层就对事务有完全的控制权了。
2。错误处理的问题。不管是弹出Error窗口还是跳转到一个Error页面,我觉得都是WebUI设计的大忌,这会给浏览用户带来很大的困扰。我的处理方法是:在BusinessRule里面每个类里面会有一个Public的ErrorMessage供表示层读取,如果BusinessRule遇到错误,一方面要把Exception.ErrorMessage这样专业的技术错误术语通过Log4Net记录在数据库中,以后技术人员可以查看。而给浏览用户要返回一个友好的提示信息,这些信息就记录在BusinessRule的ErrorMessage中,供表示层读取,然后以Response.Write的方式在表示层显示出来。就算一部分错了,其他部分也不会阻碍用户去浏览。
3。关于DataAccess和BusinessRule的职责,理论上说,BusinessRule应该和NHibernate完全不打交道的,这应该全都是DataAccess的事情。但是有时候你会发现这很难办到,我困惑。BusinessRule层真的完全用不到NHibernate马?最突出的问题是组合条件查询,组合条件更新删除。不知道大家在这方面有没有好的方法?
大家可以通过我的图提出更多的问题,希望大家踊跃讨论!