啊。。。最近机房好热啊,每天的节奏各种深似海啊,一般的步骤是这样的:一进机房,“我【哔——】,怎么这么热,又没人开空调,要报警了!”然后有人打开了空调,“我【哔——】,怎么还有窗户开着。”关上窗户。。。“我【哔——】,谁又出去不关门啊。”再去关上门,“我【哔——】,空调又被关上了。。。”
哎,每天从外面进来就看到咱们屋开着空调又通风,真是一股淡淡的忧伤啊,不过昨天新下了规定,今天看起来还行啊,起码不会开门开空调了。
最近状态真是鱼的不行,研究抽象工厂+反射登录的三层架构时间拖得太长了,战线一分散就会出事,然后VS2013童鞋心情不好还罢工了,一运行就出现无法启动程序,拒绝访问。
大概就是这个样子吧,解决这玩意还用了好长时间,一直以为可能是权限啊,调试属性啊,配置啊什么的问题,结果网上好多人说这是因为某游戏设置了禁止调试的程序造成的。。。我靠,我大2002年的魔兽争霸3居然把十年后的Visual Studio给拒绝访问了?没错,我就是不相信是大魔兽禁的,果然,修复了一下之后又能开心的运行了,幸好没删掉。
我在网上搜答案的时候看到也有咱们的人在csdn上发了帖子,不过也没看到有有用的回复,不知道解决了没有啊,有更好的方法也求各位大神告知一下,不然这遇到一次修复一次实在伤不起啊。
好了,又是扯了一些没用的东西,这次主要是写代码来了,好不容易研究了一点玩意,凑个博客。
上次就随便说了说三层的理论知识,都说实践是检验真理的唯一标准,我这实践了好几天,也该跟真理沾点边了,但是总有种越走越远的感觉。。。
学抽象工厂的时候知道了一个App.config,在这里面可以定义一个字符串,然后用发射来读取字符串达到不修改内部代码就更换数据库的效果,我们虽然还用不上别的数据库,但是可以想象一下怎么改不是吗,所以我就这么写了
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="ConnStr" value ="Data Source=192.168.24.199;Initial Catalog=Student;User ID=sa;Pwd=123456"></add>
<add key ="DB" value="Sql"></add>
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
原来我把连接语句也写到这里了啊,其实我倒是想着,写到这还不如写道代码里面安全呢,但是这里方便更改啊,换数据库什么的,简直喝汤一样。所以产生了个想法,要是真的写在这里的话,那我们是不是要搞一个加密呢?
加密的事以后再说,今次先凑篇博客出来。
然后呢,既然用了反射,那就要用抽象工厂模式了。整个例子好像没体现出来为什么要用工厂,因为,我们没换数据库,真的换一下的话会更明显。
工厂代码
Imports System.Reflection
Imports System.Configuration
Imports ChargeSystem.IDAL.Sql
Public Class DataAccess
Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DB")
Dim AssemblyName As String = "ChargeSystem.DAL."
Dim ClassName As String = "ChargeSystem.DAL." & strDB
Public Function CreateUser() As IDAL.Sql.IUser
CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IUser)
End Function
End Class
这里的工厂返回的接口是为了让D层直接继承,然后重写方法的。
D层代码
Imports System.Data.SqlClient
Imports System.Configuration
Public Class SqlQueryUserInfo : Implements IDAL.Sql.IUser
Dim ConnStr As String = System.Configuration.ConfigurationSettings.AppSettings("ConnStr")
Dim conn As SqlConnection = New SqlConnection(ConnStr)
Public Function QueryUserInfo(user As Model.UserInfo) As Model.UserInfo Implements IDAL.Sql.IUser.QueryUserInfo
Dim strSQL As String = "select * from UserInfo where Username=@username"
Dim SQLcmd As SqlCommand = New SqlCommand(strSQL, conn)
Dim reader As SqlDataReader
Dim UserFromData As New Model.UserInfo
SQLcmd.Parameters.Add(New SqlParameter("@username", user.UserName))
Try
conn.Open()
reader = SQLcmd.ExecuteReader
reader.Read()
UserFromData.UserName = reader.Item("username")
UserFromData.PWD = reader.Item("password")
Return UserFromData
Catch ex As Exception
MsgBox(ex.Message.ToString())
Return user
End Try
conn.Close()
End Function
End Class
哇。。。看着好多啊,这里D层可以用一个SQLhelper什么的类进行读取等重复操作,目前还没有研究,下次再说吧~
然后,D层的代码要在哪里用呢?当然是B层来调用了,B层中写好了一些逻辑判断,或是操作什么。简单来说就是B层写文档,D层编代码,恩这样的感觉吧。
B层代码
Public Class JudgeUserInfo
Public Function IdentifyUser(ByVal user As Model.UserInfo) As Model.UserInfo
Dim Iuser As IDAL.Sql.IUser
Dim dataAccess As New DALFactory.DataAccess
Dim duser As Model.UserInfo
Iuser = dataAccess.CreateUser()
duser = Iuser.QueryUserInfo(user)
Return duser
End Function
End Class
最后就是U层了,U层是干嘛的,是把用户输入的信息传给系统的,这次是调用B层的方法,然后将返回的哪个实体的信息和用户输入的进行对比,至于验证之类的操作,可以放到外观层上去做,我这里就懒一点,不写那么多了。
U层代码
Public Class frmLogin
Private Sub butLogin_Click(sender As Object, e As EventArgs) Handles butLogin.Click
Try
Dim user1 As New Model.UserInfo
Dim user2 As New Model.UserInfo
Dim JUI As New BLL.JudgeUserInfo
user1.UserName = txtUsername.Text.Trim()
user1.PWD = txtPWD.Text
user2 = JUI.IdentifyUser(user1)
If user2.UserName = user1.UserName And user2.PWD = user1.PWD Then
MsgBox("登陆成功!请稍后……")
Exit Sub
Else
MsgBox("该用户信息不存在,请重新输入!")
Exit Sub
End If
Catch ex As Exception
MessageBox.Show(ex.Message.ToString())
End Try
End Sub
End Class
至于要引用的实体层我就不写了,就两个属性一个用户名,一个密码贴上来省的大家笑话。这没有注释确实是我的失误,做机房的时候一定注意。
最后,天气炎热,大家回家注意安全,下周见。