重构机房已经开始三个多星期了,从刚开始的一头雾水,到现在的柳暗花明,由开始的无从下手,到现在感觉犹
如脱胎换骨了般。和两个星期前相比,现在明朗了多了,心情也好了不少。
先给大家看一下这次重构的整体架构图:
在前面一篇博文中对三层(UI、BLL、DAL、Entity)http://blog.csdn.net/zhangzijiejiayou/article/details/38226135做了详细的介绍。本篇博客着重总结一下在三层的基础上我所做的改进,也就是传说中的七层。
1.Facade层(外观层)
定义:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
个人理解:外观模式就好像一个目录,将所有的方法都整合在了该层(就像接口似的),是一个节点,U层需要什么就直接从外观层调用,减少了U层与B层的耦合,方便了用户对方法的调用。
机房重构登陆窗体为例,给大家分享一下代码:
<span style="font-family:KaiTi_GB2312;font-size:18px;">''' <summary>
''' 验证登陆
''' </summary>
''' <param name="enUser"></param>
''' <returns>ture or false</returns>
''' <remarks></remarks>
Public Function select_faced(enUser As ChargeEntity.ChargeT_UsersEntity) As boolean Dim selectfaced As New ChargeManagerBLL '实例化b层
Dim dt As boolean '定义dt为集合类型
dt = selectfaced.SelectUserBLL(enUser) '调用b层函数
Return dt
End Function</span>
2.抽象工厂+反射+配置文件—实现数据库访问
抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
下面是我的抽象工厂的一个方法
<span style="font-family:KaiTi_GB2312;font-size:18px;">Imports System.Reflection '引入反射
Imports System.Configuration '引用程序集
Imports ChargeIDAL '引用接口
Public Class ChargeT_UsersFactory
Private Shared ReadOnly AssemblyName As String = "ChargeDAL" '声明程序集名
Private Shared ReadOnly db As String = ConfigurationManager.AppSettings("DB") '
''' <summary>
''' 用户登陆
''' </summary>
''' <returns>ture or false</returns>
''' <remarks></remarks>
Public Function SelectUsers() As ChargeT_UsersIDAL
Dim iselect As ChargeIDAL.ChargeT_UsersIDAL
Dim className As String = "ChargeDAL" + "." + db + "ChargeT_UsersDAL" '拼接字符串实现数据库访问
iselect = CType(Assembly.Load(AssemblyName).CreateInstance(className), ChargeT_UsersIDAL)
Return iselect
End Function</span>
配置文件:App.config,存在于UI层。
<span style="font-family:KaiTi_GB2312;font-size:18px;">1一般格式:<configuration>
2<configSections> //配置节声明区域,包含配置节和命名空间声明
3<section> //配置节声明
4 <sectionGroup> //定义配置节组
5 <section> //配置节组中的配置节声明
6<appSettings> //预定义配置节
7<Custom element for configuration section> //配置节设置区域 </span>
我的配置文件:
<span style="font-family:KaiTi_GB2312;font-size:18px;">?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<add key="DB" value="Sqlserver"/>
<add key ="sqlConnect" value ="Data source=.; Database =ChargeSystem; User ID = sa;Password = 123456 "/>
</appSettings>
</configuration></span>
注意:写好配置文件要引用System.Configuration。注意工厂中拼接字符串中有DB时注意更改D层相应的类名
为:配置文件中DB的名字+类名。或者上例工厂中去掉DB不改D层类名也可。
反射:提供了封装程序集、模块和类型的对象。上面的我的抽象工厂中已经用到不在累述。
3.接口:B层通过接口调用D层的方法,不直接和数据库打交道,减少了B层和D层的耦合,保证了安全。
我的部分接口:
<span style="font-family:KaiTi_GB2312;font-size:18px;">mports ChargeEntity
Public Interface ChargeT_UsersIDAL
'定义登陆接口
Function SelectUsers(enUser As ChargeEntity.ChargeT_UsersEntity) As List(Of ChargeEntity.ChargeT_UsersEntity)
'定义修改密码接口
Function ChangePWD_DAL(enUser As ChargeEntity.ChargeT_UsersEntity) As Boolean
'定义添加用户接口
Function AddUser_DAL(enUser As ChargeEntity.ChargeT_UsersEntity) As Integer
'定义查询用户接口
Function FindUser_DAL(enUser As ChargeEntity.ChargeT_UsersEntity) As List(Of ChargeEntity.ChargeT_UsersEntity)
'定义删除用户接口
Function DeleteUser_DAL(enUser As ChargeEntity.ChargeT_UsersEntity) As Integer
End Interface</span>
个人点睛:外观层和接口层其实是一样的,减少了各层的耦合,使调用方法更加方便。通过抽象工厂来创建接
口,I层定义接口,D层来实现接口。也就是所谓的面向接口编程。通过抽象工厂+反射+配置文件实现了数据库的访
问,使将来更换数据库时更加灵活方便。分层其实就像搭建房屋一样,骨架搭建好了(分层),剩下的就是慢慢地就
是一摞一摞(一条条线)地砌砖就行了。