zoukankan      html  css  js  c++  java
  • 机房重构 之 抽象工厂+反射+配置文件 实现数据库訪问

      重构机房已经開始三个多星期了,从刚開始的一头雾水,到如今的柳暗花明,由開始的无从下手,到如今感觉犹

    如脱胎换骨了般。和两个星期前相比。如今明朗了多了,心情也好了不少。

      先给大家看一下这次重构的总体架构图:


      在前面一篇博文中对三层(UI、BLL、DAL、Entity)http://blog.csdn.net/zhangzijiejiayou/article/details/38226135做了具体的介绍。

    本篇博客着重总结一下在三层的基础上我所做的改进,也就是传说中的七层。

    1.Facade层(外观层)

      定义:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口。这个接口使得这一子系统更加easy使用。

      个人理解:外观模式就好像一个文件夹,将全部的方法都整合在了该层(就像接口似的),是一个节点。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)
        '定义改动password接口
        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层来实现接口。也就是所谓的面向接口编程。

    通过抽象工厂+反射+配置文件实现了数据库的訪

    问。使将来更换数据库时更加灵活方便。

    分层事实上就像搭建房屋一样。骨架搭建好了(分层)。剩下的就是慢慢地就

    是一摞一摞(一条条线)地砌砖即可了。



  • 相关阅读:
    python
    python
    打开python自带IDLE出的问题
    Python GUI编程(Tkinter)8、CheckButton多选框控件
    Python GUI编程(Tkinter)7、带滚动条的Text
    Python GUI编程(Tkinter)6、Text控件
    Python GUI编程(Tkinter)5、点击按钮输出输入框中的内容
    Python GUI编程(Tkinter)4、Entry控件
    Python GUI编程(Tkinter)3、Button控件
    Python GUI编程(Tkinter)2、Label控件
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5223626.html
Copyright © 2011-2022 走看看