日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

三層架構(gòu)之抽象工廠加反射----實(shí)現(xiàn)數(shù)據(jù)庫轉(zhuǎn)換

系統(tǒng) 1775 0

注意:文中代碼有誤,為保留歷史痕跡在本文不做修改,正確代碼詳 見《 糾錯(cuò)

在做系統(tǒng)的時(shí)候有意識(shí)的用到了抽象工廠這個(gè)設(shè)計(jì)模式,主要解決的是數(shù)據(jù)庫更換的問題。

下面就以簡單的登錄來逐步的分析一下這個(gè)模式。

經(jīng)典的三層架構(gòu)

image

數(shù)據(jù)庫如下

image

1. 一般的數(shù)據(jù)庫連接方式

界面層

image

        
             1:  
        
        
          Public
        
        
          Class
        
         Login
      
        
             2:  
        
        
          Private
        
        
          Sub
        
         btnLogin_Click(
        
          ByVal
        
         sender 
        
          As
        
         System.
        
          Object
        
        , 
        
          ByVal
        
         e 
        
          As
        
         System.EventArgs) 
        
          Handles
        
         btnLogin.Click
      
        
             3:  
        
        
          Dim
        
         LUser 
        
          As
        
        
          New
        
         Entity.User
      
        
             4:  
        
        
          Dim
        
         BCheck 
        
          As
        
        
          New
        
         BLL.B_Login
      
        
             5:  
        
                LUser.User_ID = txtName.Text
      
        
             6:  
        
                LUser.User_Pwd = txtPwd.Text
      
        
             7:  
        
        
          If
        
         BCheck.Check(LUser) = 
        
          True
        
        
          Then
        
      
        
             8:  
        
                    MsgBox(
        
          "登錄成功!"
        
        )
      
        
             9:  
        
        
          Else
        
      
        
            10:  
        
                    MsgBox(“
        
          "登錄失敗!"
        
        )
      
        
            11:  
        
        
          End
        
        
          If
        
      
        
            12:  
        
        
          End
        
        
          Sub
        
      
        
            13:  
        
      
        
            14:  
        
        
          Private
        
        
          Sub
        
         btnCancle_Click(
        
          ByVal
        
         sender 
        
          As
        
         System.
        
          Object
        
        , 
        
          ByVal
        
         e 
        
          As
        
         System.EventArgs) 
        
          Handles
        
         btnCancle.Click
      
        
            15:  
        
        
          End
        
      
        
            16:  
        
        
          End
        
        
          Sub
        
      
        
            17:  
        
        
          End
        
        
          Class
        
      
<style type="text/css"> <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consolas,"Courier New",courier,monospace; background-color:#ffffff} .csharpcode pre {margin:0em} .csharpcode .rem {color:#008000} .csharpcode .kwrd {color:#0000ff} .csharpcode .str {color:#006080} .csharpcode .op {color:#0000c0} .csharpcode .preproc {color:#cc6633} .csharpcode .asp {background-color:#ffff00} .csharpcode .html {color:#800000} .csharpcode .attr {color:#ff0000} .csharpcode .alt {background-color:#f4f4f4; width:100%; margin:0em} .csharpcode .lnum {color:#606060} --> </style> <style type="text/css"> <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consolas,"Courier New",courier,monospace; background-color:#ffffff} .csharpcode pre {margin:0em} .csharpcode .rem {color:#008000} .csharpcode .kwrd {color:#0000ff} .csharpcode .str {color:#006080} .csharpcode .op {color:#0000c0} .csharpcode .preproc {color:#cc6633} .csharpcode .asp {background-color:#ffff00} .csharpcode .html {color:#800000} .csharpcode .attr {color:#ff0000} .csharpcode .alt {background-color:#f4f4f4; width:100%; margin:0em} .csharpcode .lnum {color:#606060} --> </style> <style type="text/css"> <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consolas,"Courier New",courier,monospace; background-color:#ffffff} .csharpcode pre {margin:0em} .csharpcode .rem {color:#008000} .csharpcode .kwrd {color:#0000ff} .csharpcode .str {color:#006080} .csharpcode .op {color:#0000c0} .csharpcode .preproc {color:#cc6633} .csharpcode .asp {background-color:#ffff00} .csharpcode .html {color:#800000} .csharpcode .attr {color:#ff0000} .csharpcode .alt {background-color:#f4f4f4; width:100%; margin:0em} .csharpcode .lnum {color:#606060} --> </style>

業(yè)務(wù)邏輯層

      
           1:  
      
      
        Public
      
      
        Class
      
       B_Login
    
      
           2:  
      
      
        Function
      
       Check(
      
        ByVal
      
       User 
      
        As
      
       Entity.User) 
      
        As
      
      
        Boolean
      
    
      
           3:  
      
      
        Dim
      
       DaUser 
      
        As
      
      
        New
      
       DAL.D_UserInfo
    
      
           4:  
      
      
        Dim
      
       BlUser 
      
        As
      
      
        New
      
       Entity.User
    
      
           5:  
      
              Bluser.User_ID=User.ID
    
      
           6:  
      
              BlUser = DaUser.Check(BlUser)    
    
      
           7:  
      
      
        If
      
       BlUser.User_Pwd = User.User_Pwd 
      
        Then
      
    
      
           8:  
      
      
        Return
      
      
        True
      
    
      
           9:  
      
      
        Else
      
    
      
          10:  
      
      
        Return
      
      
        False
      
    
      
          11:  
      
      
        End
      
      
        If
      
    
      
          12:  
      
      
        End
      
      
        Function
      
    
      
          13:  
      
      
        End
      
       Class
    
<style type="text/css"> <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consolas,"Courier New",courier,monospace; background-color:#ffffff} .csharpcode pre {margin:0em} .csharpcode .rem {color:#008000} .csharpcode .kwrd {color:#0000ff} .csharpcode .str {color:#006080} .csharpcode .op {color:#0000c0} .csharpcode .preproc {color:#cc6633} .csharpcode .asp {background-color:#ffff00} .csharpcode .html {color:#800000} .csharpcode .attr {color:#ff0000} .csharpcode .alt {background-color:#f4f4f4; width:100%; margin:0em} .csharpcode .lnum {color:#606060} --> </style> <style type="text/css"> <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consolas,"Courier New",courier,monospace; background-color:#ffffff} .csharpcode pre {margin:0em} .csharpcode .rem {color:#008000} .csharpcode .kwrd {color:#0000ff} .csharpcode .str {color:#006080} .csharpcode .op {color:#0000c0} .csharpcode .preproc {color:#cc6633} .csharpcode .asp {background-color:#ffff00} .csharpcode .html {color:#800000} .csharpcode .attr {color:#ff0000} .csharpcode .alt {background-color:#f4f4f4; width:100%; margin:0em} .csharpcode .lnum {color:#606060} --> </style> <style type="text/css"> <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consolas,"Courier New",courier,monospace; background-color:#ffffff} .csharpcode pre {margin:0em} .csharpcode .rem {color:#008000} .csharpcode .kwrd {color:#0000ff} .csharpcode .str {color:#006080} .csharpcode .op {color:#0000c0} .csharpcode .preproc {color:#cc6633} .csharpcode .asp {background-color:#ffff00} .csharpcode .html {color:#800000} .csharpcode .attr {color:#ff0000} .csharpcode .alt {background-color:#f4f4f4; width:100%; margin:0em} .csharpcode .lnum {color:#606060} --> </style>

數(shù)據(jù)持久層

      
           1:  
      
      
        Imports
      
       System.Data.SqlClient
    
      
           2:  
      
      
        Public
      
      
        Class
      
       D_UserInfo
    
      
           3:  
      
      
        Dim
      
       ConnStr 
      
        As
      
      
        String
      
       = 
      
        "Data Source=******;Initial Catalog=Student;User ID=sa;Password=******"
      
    
      
           4:  
      
      
        Dim
      
       conn 
      
        As
      
       SqlConnection = 
      
        New
      
       SqlConnection(ConnStr)
    
      
           5:  
      
      
        Function
      
       Check(
      
        ByVal
      
       User 
      
        As
      
       Entity.User) 
      
        As
      
       Entity.User
    
      
           6:  
      
      
        Dim
      
       sql 
      
        As
      
      
        String
      
       = 
      
        "select * from UserInfo where UserInfo="
      
       & User.User_ID
    
      
           7:  
      
      
        Dim
      
       cmd 
      
        As
      
       SqlCommand = 
      
        New
      
       SqlCommand(sql, conn)
    
      
           8:  
      
      
        Dim
      
       read 
      
        As
      
       SqlDataReader
    
      
           9:  
      
      
        Try
      
    
      
          10:  
      
                  conn.Open()
    
      
          11:  
      
                  read = cmd.ExecuteReader
    
      
          12:  
      
                  User.User_ID = read.Item(0)
    
      
          13:  
      
                  User.User_Pwd = read.Item(1)
    
      
          14:              
      
      
        Return
      
       User
    
      
          15:  
      
      
        Catch
      
       ex 
      
        As
      
       Exception
    
      
          16:  
      
                  User.User_Pwd = 
      
        ""
      
    
      
          17:  
      
      
        Return
      
       User
    
      
          18:  
      
      
        End
      
      
        Try
      
    
      
          19:  
      
      
        End
      
      
        Function
      
    
      
          20:  
      
      
        End
      
      
        Class
      
    
<style type="text/css"> <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consolas,"Courier New",courier,monospace; background-color:#ffffff} .csharpcode pre {margin:0em} .csharpcode .rem {color:#008000} .csharpcode .kwrd {color:#0000ff} .csharpcode .str {color:#006080} .csharpcode .op {color:#0000c0} .csharpcode .preproc {color:#cc6633} .csharpcode .asp {background-color:#ffff00} .csharpcode .html {color:#800000} .csharpcode .attr {color:#ff0000} .csharpcode .alt {background-color:#f4f4f4; width:100%; margin:0em} .csharpcode .lnum {color:#606060} --> </style>

2. 簡單工廠

image

添加一個(gè)工廠類和一個(gè)接口

接口類

      
           1:  
      
      
        Public
      
      
        Interface
      
       IUserInfo
    
      
           2:  
      
      
        Function
      
       Check(
      
        ByVal
      
       IUser 
      
        As
      
       Entity.User) 
      
        As
      
       Entity.User
    
      
           3:  
      
      
        End
      
      
        Interface
      
    
<style type="text/css"> <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consolas,"Courier New",courier,monospace; background-color:#ffffff} .csharpcode pre {margin:0em} .csharpcode .rem {color:#008000} .csharpcode .kwrd {color:#0000ff} .csharpcode .str {color:#006080} .csharpcode .op {color:#0000c0} .csharpcode .preproc {color:#cc6633} .csharpcode .asp {background-color:#ffff00} .csharpcode .html {color:#800000} .csharpcode .attr {color:#ff0000} .csharpcode .alt {background-color:#f4f4f4; width:100%; margin:0em} .csharpcode .lnum {color:#606060} --> </style> <style type="text/css"> <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consolas,"Courier New",courier,monospace; background-color:#ffffff} .csharpcode pre {margin:0em} .csharpcode .rem {color:#008000} .csharpcode .kwrd {color:#0000ff} .csharpcode .str {color:#006080} .csharpcode .op {color:#0000c0} .csharpcode .preproc {color:#cc6633} .csharpcode .asp {background-color:#ffff00} .csharpcode .html {color:#800000} .csharpcode .attr {color:#ff0000} .csharpcode .alt {background-color:#f4f4f4; width:100%; margin:0em} .csharpcode .lnum {color:#606060} --> </style>

工廠類

      
           1:  
      
      
        Imports
      
       [
      
        Interface
      
      ]
    
      
           2:  
      
      
        Public
      
      
        Class
      
       DFactory
    
      
           3:  
      
      
        'Dim DataBase As String = "Access"
      
    
      
           4:  
      
      
        Dim
      
       DataBase 
      
        As
      
      
        String
      
       = 
      
        "Sql"
      
    
      
           5:  
      
      
        Function
      
       CreateUserInfo() 
      
        As
      
       IUserInfo
    
      
           6:  
      
      
        Dim
      
       DB 
      
        As
      
       IUserInfo
    
      
           7:  
      
      
        Select
      
      
        Case
      
       DataBase
    
      
           8:  
      
      
        Case
      
      
        "Sql"
      
    
      
           9:  
      
                      DB = 
      
        New
      
       D_UserInfoSql
    
      
          10:  
      
      
        'Case "Access"
      
    
      
          11:  
      
      
        '    DB = New D_UserInfoAccess
      
    
      
          12:  
      
      
        End
      
      
        Select
      
    
      
          13:  
      
      
        Return
      
       DB
    
      
          14:  
      
      
        End
      
      
        Function
      
    
      
          15:  
      
      
        End
      
      
        Class
      
    
<style type="text/css"> <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consolas,"Courier New",courier,monospace; background-color:#ffffff} .csharpcode pre {margin:0em} .csharpcode .rem {color:#008000} .csharpcode .kwrd {color:#0000ff} .csharpcode .str {color:#006080} .csharpcode .op {color:#0000c0} .csharpcode .preproc {color:#cc6633} .csharpcode .asp {background-color:#ffff00} .csharpcode .html {color:#800000} .csharpcode .attr {color:#ff0000} .csharpcode .alt {background-color:#f4f4f4; width:100%; margin:0em} .csharpcode .lnum {color:#606060} --> </style> <style type="text/css"> <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consolas,"Courier New",courier,monospace; background-color:#ffffff} .csharpcode pre {margin:0em} .csharpcode .rem {color:#008000} .csharpcode .kwrd {color:#0000ff} .csharpcode .str {color:#006080} .csharpcode .op {color:#0000c0} .csharpcode .preproc {color:#cc6633} .csharpcode .asp {background-color:#ffff00} .csharpcode .html {color:#800000} .csharpcode .attr {color:#ff0000} .csharpcode .alt {background-color:#f4f4f4; width:100%; margin:0em} .csharpcode .lnum {color:#606060} --> </style>

當(dāng)然 D_UserInfoSql 實(shí)現(xiàn)接口,代碼基本不變

當(dāng)有新的數(shù)據(jù)庫使用時(shí)候(例如 Access 數(shù)據(jù)庫)可以將工廠中的注釋部分添上,然后重新寫 Dal 層就可以直接使用,但是這樣的不足是還是需要再次編譯工廠,利用反射可以解決這個(gè)問題。

3. 抽象工廠加反射

image

工廠類

      
           1:  
      
      
        Imports
      
       [
      
        Interface
      
      ]
    
      
           2:  
      
      
        Imports
      
       System.Reflection
    
      
           3:  
      
      
        Public
      
      
        Class
      
       DFactory
    
      
           4:  
      
      
        '抽象工廠加反射
      
    
      
           5:  
      
      
        Dim
      
       DBString 
      
        As
      
      
        String
      
       = System.Configuration.ConfigurationSettings.AppSettings(
      
        "DBString"
      
      )
    
      
           6:  
      
      
        Function
      
       CreateUserInfo() 
      
        As
      
       IUserInfo
    
      
           7:  
      
      
        Return
      
      
        CType
      
      (
      
        Assembly
      
      .Load(
      
        "DAL"
      
      ).CreateInstance(
      
        "DAL.D_UserInfo"
      
       & DBString), IUserInfo)
    
      
           8:  
      
      
        End
      
      
        Function
      
    
      
           9:  
      
      
        End
      
      
        Class
      
    
<style type="text/css"> <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consolas,"Courier New",courier,monospace; background-color:#ffffff} .csharpcode pre {margin:0em} .csharpcode .rem {color:#008000} .csharpcode .kwrd {color:#0000ff} .csharpcode .str {color:#006080} .csharpcode .op {color:#0000c0} .csharpcode .preproc {color:#cc6633} .csharpcode .asp {background-color:#ffff00} .csharpcode .html {color:#800000} .csharpcode .attr {color:#ff0000} .csharpcode .alt {background-color:#f4f4f4; width:100%; margin:0em} .csharpcode .lnum {color:#606060} --> </style>

數(shù)據(jù)持久層

      
           1:  
      
      
        Imports
      
       System.Data.SqlClient
    
      
           2:  
      
      
        Public
      
      
        Class
      
       D_UserInfoSql : 
      
        Implements
      
       [
      
        Interface
      
      ].IUserInfo
    
      
           3:  
      
      
        'Dim ConnStr As String = "Data Source=******;Initial Catalog=Student;User ID=sa;Password=******"
      
    
      
           4:  
      
      
        Dim
      
       ConnStr 
      
        As
      
      
        String
      
       = System.Configuration.ConfigurationSettings.AppSettings(
      
        "ConnStr"
      
      )
    
      
           5:  
      
      
        Dim
      
       conn 
      
        As
      
       SqlConnection = 
      
        New
      
       SqlConnection(ConnStr)
    
      
           6:  
      
      
        Public
      
      
        Function
      
       Check(
      
        ByVal
      
       IUser 
      
        As
      
       Entity.User) 
      
        As
      
       Entity.User 
      
        Implements
      
       [
      
        Interface
      
      ].IUserInfo.Check
    
      
           7:  
      
      
        Dim
      
       sql 
      
        As
      
      
        String
      
       = 
      
        "select * from UserInfo where UserInfo="
      
       & IUser.User_ID
    
      
           8:  
      
      
        Dim
      
       cmd 
      
        As
      
       SqlCommand = 
      
        New
      
       SqlCommand(sql, conn)
    
      
           9:  
      
      
        Dim
      
       read 
      
        As
      
       SqlDataReader
    
      
          10:  
      
      
        Try
      
    
      
          11:  
      
                  conn.Open()
    
      
          12:  
      
                  read = cmd.ExecuteReader
    
      
          13:  
      
                  IUser.User_ID = read.Item(0)
    
      
          14:  
      
                  IUser.User_Pwd = read.Item(1)
    
      
          15:  
      
      
        Return
      
       IUser
    
      
          16:  
      
      
        Catch
      
       ex 
      
        As
      
       Exception
    
      
          17:  
      
                  IUser.User_Pwd = 
      
        ""
      
    
      
          18:  
      
      
        Return
      
       IUser
    
      
          19:  
      
      
        End
      
      
        Try
      
    
      
          20:  
      
      
        End
      
      
        Function
      
    
      
          21:  
      
      
        End
      
      
        Class
      
    
<style type="text/css"> <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consolas,"Courier New",courier,monospace; background-color:#ffffff} .csharpcode pre {margin:0em} .csharpcode .rem {color:#008000} .csharpcode .kwrd {color:#0000ff} .csharpcode .str {color:#006080} .csharpcode .op {color:#0000c0} .csharpcode .preproc {color:#cc6633} .csharpcode .asp {background-color:#ffff00} .csharpcode .html {color:#800000} .csharpcode .attr {color:#ff0000} .csharpcode .alt {background-color:#f4f4f4; width:100%; margin:0em} .csharpcode .lnum {color:#606060} --> </style>

配置文件

      
           1:  
      
      
        <
      
      
        appSettings
      
      
        >
      
    
      
           2:  
      
      
        <
      
      
        add
      
      
        key
      
      
        ="ConnStr"
      
      
        value
      
      
        ="Data Source=******;Initial Catalog=Student;User ID=sa;Password=******"
      
      
        ></
      
      
        add
      
      
        >
      
    
      
           3:  
      
      
        <
      
      
        add
      
      
        key
      
      
        ="DBString"
      
      
        value
      
      
        ="Sql"
      
      
        ></
      
      
        add
      
      
        >
      
    
      
           4:  
      
      
        </
      
      
        appSettings
      
      
        >
      
    
<style type="text/css"> <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consolas,"Courier New",courier,monospace; background-color:#ffffff} .csharpcode pre {margin:0em} .csharpcode .rem {color:#008000} .csharpcode .kwrd {color:#0000ff} .csharpcode .str {color:#006080} .csharpcode .op {color:#0000c0} .csharpcode .preproc {color:#cc6633} .csharpcode .asp {background-color:#ffff00} .csharpcode .html {color:#800000} .csharpcode .attr {color:#ff0000} .csharpcode .alt {background-color:#f4f4f4; width:100%; margin:0em} .csharpcode .lnum {color:#606060} --> </style>

添加兩個(gè) Key ,一個(gè)是連接數(shù)據(jù)庫的字符串,一個(gè)是通過反射來產(chǎn)生不同數(shù)據(jù)庫的 Dal 層的

這樣一來就可以實(shí)現(xiàn)設(shè)計(jì)模式中的“開閉原則”,如果更換數(shù)據(jù)庫只需要增加類(DAL),而不需要更改,更不需要重新編譯。

PS 配置文件必須在界面層

1、 反射的寫法 :

objType=Assembly.Load(AssemblyPath).CreateInstance(className); 其中: AssemblyPath 指程序集名。 className 指命名空間 . 類名稱。

2、 反射的一個(gè)原則 : 一切皆以 UI 層的 bin 文件夾中的 dll 名稱為中心。 ( 原因很簡單 :.net 類加載的機(jī)制就是默認(rèn)從本程序集的 bin 文件中找 , 所以 bin 文件夾中一定要有要加載的程序集的 dll) UI 層中 bin 文件夾中 dll 叫什么名字 AssemblyPath 就使用什么名字 ,bin 內(nèi)部類的全名叫什么, className 就寫成什么全名。 .net 中的引用 : 加入對(duì)某個(gè)程序集的引用就能在程序集有變化時(shí)自動(dòng)拷貝 dll

三層架構(gòu)之抽象工廠加反射----實(shí)現(xiàn)數(shù)據(jù)庫轉(zhuǎn)換


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 乃东县| 称多县| 巴塘县| 上犹县| 蒲城县| 郎溪县| 石屏县| 曲沃县| 仙桃市| 尼木县| 丰顺县| 卓尼县| 化州市| 高雄县| 铁岭县| 夏邑县| 林甸县| 泰来县| 巴马| 南投县| 曲麻莱县| 吴堡县| 出国| 仁怀市| 渝中区| 汽车| 古蔺县| 公主岭市| 宜川县| 灵山县| 达州市| 邓州市| 天峨县| 伊宁市| 鄂伦春自治旗| 台中县| 泊头市| 怀柔区| 康平县| 泰安市| 秦安县|