三层架构实战篇 下

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

     上篇博客差点儿是手把手的教大家如何做一个三层结构的demo,可是实现和执行出这个样例不是我们的目的。我们的目标是学习,所以这一次我们要用VB.NET将demo实现。而且还要对demo进行一些完好。

         作为一个系统登录的demo,其核心业务就是用户输入信息,然后系统验证此用户是否有权限进入系统,并返回验证结果,仅此而已,那么有什么需求是会变化呢?细致一想,UI不会有什么大的变化,BLL层主要是处理业务逻辑的,对登录来讲也没什么变化,那么唯独DAL层了,DAL层是用来訪问数据库,而数据库不唯独SQL Server一种,假设换成Oracle或者DB2。还能实现登录系统吗?显然是不能的,怎样解决?

         这时候,是该考虑使用设计模式了,那么用什么模式呢?依据需求,当然是工厂方法模式了。可是单纯的工厂方法模式并不能解决多个数据库和多个表之间的切换问题,再想有什么办法,那就是抽象工厂模式了,它能够解决这样的涉及多个产品系列的问题,可是假设要添加功能,那么修改的地方太多……算了直接使用绝招吧——反射+抽象工厂+配置文件。

         首先我给出加了设计模式的包图

        

         然后我们就打开VS2012,新建一个VB.NET的Windows窗口应用程序,然后依照包图的结构,构建三层结构。并为每层加入须要的类和接口,完毕后例如以下图:

        

         然后我们就能够,依照一定的顺序去编写各个类的代码了,我偏好从下往上写,也就是从数据訪问层開始。当然要考虑继承关系,总得先有父类吧,还有就是高层类比方抽象类等就得先写,come on……

         插入代码

         实体层DataEntity的UserInfo类

        

Public Class UserInfo
    Private _userID As Integer
    Private _userName As String
    Private _password As String
    '各个属性值的定义
    Public Property UserID() As Integer
        Get
            Return _userID
        End Get
        Set(value As Integer)
            _userID = value
        End Set
    End Property

    Public Property UserName() As String
        Get
            Return _userName
        End Get
        Set(value As String)
            _userName = value
        End Set
    End Property

    Public Property Password() As String
        Get
            Return _password
        End Get
        Set(value As String)
            _password = value
        End Set
    End Property
End Class

         接口层IDAL的IUserInfo类

        

Imports DataEntity

Public Interface IUserInfo
    Function UserLogin(ByVal user As DataEntity.UserInfo) As DataEntity.UserInfo

End Interface

         抽象工厂Factory的DataAccess类

Imports System.Reflection
Imports System.Configuration
Imports IDAL

Public Class DataAccess
    Dim DBstr As String = System.Configuration.ConfigurationSettings.AppSettings("DB")

    Public Function CreateUser() As IDAL.IUserInfo
        Return CType(Assembly.Load("LoginDAL").CreateInstance("LoginDAL" & "." & DBstr), IUserInfo)
    End Function
End Class<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">	</span>

         表示层LoginUI的配置文件App.config

        

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key ="Connstr" value ="server =192.168.24.191;database=login;user id=sa;password=123456;" />
		<add key ="DB" value ="Sqlserver"/>
    </appSettings>
</configuration>

         数据訪问层LoginDAL的Sqlserver类

        

Imports System.Data.SqlClient
Imports DataEntity
Imports IDAL

Public Class Sqlserver : Implements IUserInfo
    Dim strConn As String = System.Configuration.ConfigurationSettings.AppSettings("Connstr")
    Dim conn As SqlConnection = New SqlConnection(strConn)

    Public Function UserLogin(user As UserInfo) As UserInfo Implements IUserInfo.UserLogin
        Dim Sqlserver As String = "select * from Users where UserName =@username"
        Dim cmd As SqlCommand = New SqlCommand(Sqlserver, conn)
        cmd.Parameters.Add(New SqlParameter("@username", user.UserName))
        Dim reader As SqlDataReader

        Dim user1 As New UserInfo
        Try
            conn.Open()
            reader = cmd.ExecuteReader
            While reader.Read()
                user1.UserName = reader.Item("UserName")
                user1.Password = reader.Item("Password")
            End While

            Return user1
        Catch ex As Exception
            MsgBox(ex.Message.ToString())
            Return user
        Finally
            conn.Close()
        End Try
    End Function
End Class

         业务逻辑层LoginBLL的LoginManager类

Imports Factory
Imports IDAL
Imports DataEntity

Public Class LoginManager
    Public Function IdentifyUser(ByVal user As DataEntity.UserInfo) As UserInfo
        Dim Iuser As IDAL.IUserInfo
        Dim dataAccess As New DataAccess
        Dim duser As UserInfo

        Iuser = dataAccess.CreateUser()
        duser = Iuser.UserLogin(user)
        Return duser

    End Function
End Class

         表示层LoginUI的client代码

        

Imports DataEntity
Imports LoginBLL

Public Class Form1

    Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
        Try
            Dim user1 As New UserInfo
            Dim user2 As New UserInfo
            Dim loginmanager As New LoginManager

            user1.UserName = txtUserName.Text.Trim()
            user1.Password = txtPassword.Text

            user2 = loginmanager.IdentifyUser(user1)
            If user2.UserName = user1.UserName And user2.Password = user1.Password Then
                MsgBox("登陆成功!请稍后……")
                Exit Sub
            Else
                MsgBox("该用户信息不存在,请又一次输入!")
                Exit Sub
            End If

        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString())
        End Try
       

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Me.Close()
    End Sub
End Class

         总结:通过对这么一个小的样例加设计模式和反射机制以及配置文件等等。主要是为了学习和实践,一開始我也觉得根本没有必要。甚至觉得是过度设计。可是当自己參考设计模式的书准备将这个样例进行改进和扩展的时候。才发现自己根本不知道怎样下手,只是经过查阅博客和贵人相助,终究是调试执行起来了,同一时候也对三层的理解加深了一些。




本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5222471.html,如需转载请自行联系原作者

相关文章
|
3月前
|
人工智能 监控 前端开发
支付宝 AI 出行助手高效研发指南:4 人团队的架构迁移与提效实战
支付宝「AI 出行助手」是一款集成公交、地铁、火车票、机票、打车等多项功能的智能出行产品。
563 21
支付宝 AI 出行助手高效研发指南:4 人团队的架构迁移与提效实战
|
3月前
|
消息中间件 Java Kafka
Java 事件驱动架构设计实战与 Kafka 生态系统组件实操全流程指南
本指南详解Java事件驱动架构与Kafka生态实操,涵盖环境搭建、事件模型定义、生产者与消费者实现、事件测试及高级特性,助你快速构建高可扩展分布式系统。
227 7
|
3月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
639 3
|
4月前
|
人工智能 Kubernetes 数据可视化
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
本文回顾了一次关键词监测任务在容器集群中失效的全过程,分析了中转IP复用、调度节奏和异常处理等隐性风险,并提出通过解耦架构、动态IP分发和行为模拟优化采集策略,最终实现稳定高效的数据抓取与分析。
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
|
3月前
|
消息中间件 Java 数据库
Java 基于 DDD 分层架构实战从基础到精通最新实操全流程指南
本文详解基于Java的领域驱动设计(DDD)分层架构实战,结合Spring Boot 3.x、Spring Data JPA 3.x等最新技术栈,通过电商订单系统案例展示如何构建清晰、可维护的微服务架构。内容涵盖项目结构设计、各层实现细节及关键技术点,助力开发者掌握DDD在复杂业务系统中的应用。
593 0
|
4月前
|
存储 SQL 监控
数据中台架构解析:湖仓一体的实战设计
在数据量激增的数字化时代,企业面临数据分散、使用效率低等问题。数据中台作为统一管理与应用数据的核心平台,结合湖仓一体架构,打通数据壁垒,实现高效流转与分析。本文详解湖仓一体的设计与落地实践,助力企业构建统一、灵活的数据底座,驱动业务决策与创新。
|
4月前
|
存储 设计模式 人工智能
AI Agent安全架构实战:基于LangGraph的Human-in-the-Loop系统设计​
本文深入解析Human-in-the-Loop(HIL)架构在AI Agent中的核心应用,探讨其在高风险场景下的断点控制、状态恢复与安全管控机制,并结合LangGraph的创新设计与金融交易实战案例,展示如何实现效率与安全的平衡。
698 0
|
1月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
1月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
Spring Boot 3.x 微服务架构实战指南
|
2月前
|
消息中间件 数据采集 NoSQL
秒级行情推送系统实战:从触发、采集到入库的端到端架构
本文设计了一套秒级实时行情推送系统,涵盖触发、采集、缓冲、入库与推送五层架构,结合动态代理IP、Kafka/Redis缓冲及WebSocket推送,实现金融数据低延迟、高并发处理,适用于股票、数字货币等实时行情场景。
258 3
秒级行情推送系统实战:从触发、采集到入库的端到端架构