机房收费系统个人版开始了有段时间了,但是前进的速度似乎都没有蜗牛快! 归根结底 差在哪?
几天的实践下来,我想我找到答案了---缺少动手实践
一件事情,你就是把他想的在完美,在天衣无缝,在华丽,没有去真真正正的实践也是不行的,会成为一个空想。同理呢,遇到一个问题,你把他想的比登山还难,结果就是他真的成了一座山,把你挡住了,相反,当你也能像愚公一样拿着铁锹去挖那座山时,慢慢的山也就没了。那么你也就会如诗中所说:
山重水复疑无路, 柳暗花明又一村。
米老师的思想上移,而行为下移,这句话听了很多遍了,但要说真的理解了,还真是惭愧,对于现在的任务个人版的机房收费系统,真真儿的把我给挡住了。 由此想起了前几天我还这样形容自己呢,我的学习道路上突然出现了一座大山,我该怎么办啊,好高啊! 现在想想我比愚公还笨了。我总是把问题想的多么多么复杂啊,但是却不去动手实践,渐渐的我开始恐惧了!看着同伴们都走过了我现在所处的阶段,我除了着急也该做点什么了。
端午假期,我要去做!自己做出来了才是真的懂了,思想要上移,而行为要下移! 我就是问多少人,都不如自己去做!就像我每次问学敏,她都是要我自己去做,嘿嘿,还好没有直接告诉我,要不然我岂不是学不到这么多了! 从画图着手 此次在包图中加了抽象工厂+反射 来防止系统更换数据库时,维护的困难,实现高内聚低耦合
有了图也就类似于有了思想吧,那么接下来我要去实践,打算敲一个小的登陆例子来看看这个过程是怎么实现的,于是我要再次学习抽象工厂模式,反射的格式 ,以及配置文件等问题,从新回头学习看书,发现,书上写的在好,你理解的在怎么好,用了才知道也不是那么容易的
搭建程序:
也类似于三层的搭建,根据包图的一些关系,来添加引用 具体的添加步骤参照
博客 :三层架构入门知识梳理 点击打开链接
配置文件:
<?xml version="1.0"encoding="utf-8" ?> <configuration> <appSettings> <addkey ="DB" value="DAL"/> </appSettings> </configuration>
其中KEY 就是我们自己定义的一个字段的名字,而Value的值则对应着我们所使用的数据库,他也可以换成其他数据库 ,达到易维护的目的
抽象工厂+反射:
以往我们在实例化某些东西,需要写在程序里,而抽象工厂+反射是用字符串来实例化对象,切变量可以更换,进而接触一些分支带来的耦合,在我的登陆例子中,工厂中代码如下:
Public Class dataAccess Dim strDB As String =System.Configuration.ConfigurationManager.AppSettings("DB") 'Dim AssemblyName As String ="DAL" Public Function CreateUser() AsIUser 'Dim className As String ="DAL" + "." + strDB + "User" Dim className = strDB +".user_Info" ReturnCType(Assembly.Load("DAL").CreateInstance(className), IUser) End Function End Class
工厂读取配置文件,进而知道我所用的数据库是什么,我将D层命名为了DAL ,那么DB的值也就为DAL。 整个登陆过程如下:
U层
Private Sub btnLogin_Click(sender As Object, e AsEventArgs) Handles btnLogin.Click Dim user1 As Entity.T_user = NewEntity.T_user user1.UID = txtUserName.Text.ToString() 将参数值传给实体层 user1.Upassword =txtUserPwd.Text.ToString() Dim b1 As BLL.userLogin = NewBLL.userLogin() 实例化B层 If b1.userLoginSystem(user1)Then MsgBox("登陆成功") Me.Hide() Else MsgBox("登陆失败,请重新登陆") Me.Show() End If End Sub
B层 负责逻辑判断B层需要U层传来的信息通过接数据库接口来实现。那么B层首先要告诉工厂 我需要什么接口,工厂就会通过相应的命令来创建接口。返回给B层
Public ClassuserLogin Public Function userLoginSystem(ByValuser2 As Entity.T_user) As Boolean Dim IUser1 As IDAL.IUser Dim factory AsDataAccessFactory.dataAccess = New DataAccessFactory.dataAccess实例化工厂 IUser1 = factory.CreateUser()调用工厂中创建接口的方法 'IUser1 = NewDAL.user_Info If IUser1.userLoginSystem(user2)Then 调用接口方法 通过DAL 层来实现接口 Return True Else Return False End If End Function End Class
B层 得到了工厂创建的接口后 要访问接口
IDAL
Public Interface IUser Function userLoginSystem(ByVal userLAs Entity.T_user) As Boolean End Interface
接口中的方法,也就是需要通过D层来实现的方法,在调用的过程中,D层就会将这个方法实现,返回相应的值
D层:
Public Class user_Info : Implements IUser Dim str As String = "datasource =192.168.24.74;initial catalog =studentSystem;user ID=sa;password=123456" Dim conn AsSqlClient.SqlConnection Public Sub New() conn = NewSqlClient.SqlConnection conn.ConnectionString =str conn.Open() End Sub Public Function userLoginSystem(ByValuserL As T_user) As Boolean Implements IUser.userLoginSystem Dim sqlStr As String '查询命令字符串 sqlStr = "select * fromT_user where U_ID='" & userL.UID & "' and U_password='"& userL.Upassword & "'" Dim strCmd AsSqlClient.SqlCommand strCmd = NewSqlClient.SqlCommand(sqlStr, conn) 'strCmd.CommandText =sqlStr 'strCmd.Connection =conn '执行命令并查询数据,将数据返回到datareader中 Dim dr As SqlClient.SqlDataReader= strCmd.ExecuteReader If dr.Read() Then Return True Else Return False End If End Function End Class
D层完成了接口的实现,接着这些信息也会返回给U层来判断登陆是否成功了。
这些看似很容易的步骤,在运行的时候却出现了很多问题
"未能加载文件或程序集“DAL”或它的某一个依赖项。系统找不到指定的文件”的解决方案 .
查了一些资料和社河的关于这个问题的解释,才算是把这个问题通过了
问题解决文章: DALFactory出现"未能加载文件或程序集“DAL”或它的某一个依赖项。系统找不到指定的文件”的解决方案 .
我在跟踪调试时,发现在工厂那,创建接口的过程中,找不到DAL的文件,所以停止了,而那些dll 文件在我的U层内还真的没有,复制过去了,程序好了,这个问题的其他小问题也学习了点。哎 只要你肯下工夫,也就没啥问题了吧。
工厂困扰了我一天半,今天不仅感慨 工厂一罢工,其他怎么办那!
另外 在创建接口的过程中,反射的模式 要是用错了也会出问题
反射模式如下:Assembly.Load(“程序集名称”).CreateInstance("命名空间名称.要实例化的类名")
此处程序集的名称也就是我们需要的数据库程序集名称 ,而要实例化的类名也是 数据库层中相应的类
截至到现在为止,整个过程才算是真的给运行出来,而且明白了!
思想上移,行为下移! 继续向下一个问题出发!