倔强的土豆

这只是一个备份!源地址:http://blog.csdn.net/stubbornpotatoes
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

三层架构下反射出的问题

Posted on 2011-03-25 17:11  倔强的土豆  阅读(934)  评论(4编辑  收藏  举报

  在做收费系统过程中,利用分层的思想将其分为三个层,但又考虑到更换数据库的原因,引入了设计模式中的简单工厂+反射+配置文件,这三者属于绝配,既消除了简单工厂中分支语句带来的缺憾,又缩减了抽象工厂带来的庞大的类,但是我的这种架构有一个小小的问题,咱们后面再说。                                先来看看我画的UML图,大体看一下分层的框架。                                    

  

  

再来看看在VS中具体的分层情况:

UI层和BLL层还有实体层(Entity)的作用和好处不再赘述,用过分层思想的人都明白。

  先从DAL层(也就是SQLDal)说起,这一层主要存放对数据库的操作,也就是常说的增删改查四个操作,也就意味着这一层的每个类中都是增删改查四个方法(一般情况下),其实在这四个方法中有不少的代码重复量,可以单独抽取出来一个类,可以称作SQLHelper,SQLHelper是微软完全开放源码的数据库操作类,用于简化你重复的去写那些数据库连接。具体可以百度百科一下,我也是刚刚知道有这么个东西,粗略的用了一下。下面贴一段我的代码吧:

1 ''' <summary>
2 ''' 获得所有用户信息
3 ''' </summary>
4 ''' <param name="strSql">执行的查询语句</param>
5 ''' <param name="cmd">command命令对象</param>
6 ''' <returns>所有用户的DataSet</returns>
7 ''' <remarks>18:39 2011/3/18 星期五</remarks>
8  
9 Public Function SelectAll(ByVal strSql As String, ByVal cmd As SqlCommand) As DataSet
10 cmd.Connection = conn
11 cmd.CommandText = strSql
12 Dim dap As SqlDataAdapter = New SqlDataAdapter(cmd)
13 Dim ds As New DataSet
14
15 Try
16 conn.Open()
17 dap.Fill(ds)
18 Return ds
19 Catch ex As Exception
20 Return Nothing
21 Finally
22 If Not IsNothing(conn) Then
23 conn.Close()
24 conn = Nothing
25 End If
26
27 If Not IsNothing(cmd) Then
28 cmd.Dispose()
29 cmd = Nothing
30 End If
31 End Try
32 End Function

  以上代码是执行一个查询全表的SQLHelper方法,其实这不是写死的,可以因人而异,传递的参数等等都是可以变化的,当然SQLHelper这个类在DAL层中可是说是供所有类调用的,因为在同一个类库中所以不需要引用罢了。

  再来看看IDataBase这一层,这是接口层,是BLL层和DAL层的纽带(我中间又加了Factory层),夹着一层是为了降低DAL层和BLL层得耦合度,但编过代码的人都清楚,要彻底断绝DAL层和BLL层的关系,光靠这个接口层是不行的,BLL层中还会出现DAL层得若干身影,真的更换数据库BLL层是需要有一定的改动的,这就不符合我们面向对象的开闭原则了----对修改关闭,对扩展开放。能少改就少改,这是每个程序员都应遵守的原则。

  好了,现在来说说我在开头提到的那个错误,我在Factory这一层中不论怎么引用SQLDal这一层,他都会报一个错误“未能创建对象”或者是“未能加载文件或程序集“DAL”或它的某一个依赖项。系统找不到指定文件”;这其实是属于同一个错误,就是说找不到DAL这一层(DAL.dll)

  解决方案:上网查了很多,大家一致都在说没有引用,但我确实在Factory这一层中引用了,在网上没有找到答案,就自己慢慢琢磨,最后发现在我程序存放的目录中D:\Instance\UI\ChargingSystem\bin\Debug(这可能使系统默认的主目录),这个文件夹中唯独没有DAL层,于是 我手动将DAL文件夹下有关DAL的三个文件拷贝了进去,测试成功!

  但这种手动拷贝非常的麻烦,因为只要你稍微改动DAL层就得重新拷贝,保证模板和源文件一致。

  最后我又找到了一种不用手动拷贝的方法,而是直接在DAL层上右击点属性,在属性--编译中,把生成输出路径改到UI文件夹的debug就OK了。

  为什么会出现这种情况我也不是很明白,学宇说这可能和架构有关系,我看了看王欢的架构,她就比我多出来了一层,UI这个目录下也有DAL层(DAL.dll),但依旧没有反射成功,求解?难道是VS的毛病?我不敢怀疑。