您的位置:首页 > 其它

思想上移 行为下移---抽象工厂+反射+配置文件

2013-06-14 11:28 246 查看
   
   机房收费系统个人版开始了有段时间了,但是前进的速度似乎都没有蜗牛快!  归根结底  差在哪? 
   几天的实践下来,我想我找到答案了---缺少动手实践 
   一件事情,你就是把他想的在完美,在天衣无缝,在华丽,没有去真真正正的实践也是不行的,会成为一个空想。同理呢,遇到一个问题,你把他想的比登山还难,结果就是他真的成了一座山,把你挡住了,相反,当你也能像愚公一样拿着铁锹去挖那座山时,慢慢的山也就没了。那么你也就会如诗中所说:
                    山重水复疑无路,  柳暗花明又一村。
    米老师的思想上移,而行为下移,这句话听了很多遍了,但要说真的理解了,还真是惭愧,对于现在的任务个人版的机房收费系统,真真儿的把我给挡住了。 由此想起了前几天我还这样形容自己呢,我的学习道路上突然出现了一座大山,我该怎么办啊,好高啊!  现在想想我比愚公还笨了。我总是把问题想的多么多么复杂啊,但是却不去动手实践,渐渐的我开始恐惧了!看着同伴们都走过了我现在所处的阶段,我除了着急也该做点什么了。
   端午假期,我要去做!自己做出来了才是真的懂了,思想要上移,而行为要下移! 我就是问多少人,都不如自己去做!就像我每次问学敏,她都是要我自己去做,嘿嘿,还好没有直接告诉我,要不然我岂不是学不到这么多了!     从画图着手 此次在包图中加了抽象工厂+反射 来防止系统更换数据库时,维护的困难,实现高内聚低耦合
 
   



    有了图也就类似于有了思想吧,那么接下来我要去实践,打算敲一个小的登陆例子来看看这个过程是怎么实现的,于是我要再次学习抽象工厂模式,反射的格式 ,以及配置文件等问题,从新回头学习看书,发现,书上写的在好,你理解的在怎么好,用了才知道也不是那么容易的  
    搭建程序:
     也类似于三层的搭建,根据包图的一些关系,来添加引用 具体的添加步骤参照
      博客 :三层架构入门知识梳理  点击打开链接
    配置文件: 

<?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("命名空间名称.要实例化的类名") 
   此处程序集的名称也就是我们需要的数据库程序集名称 ,而要实例化的类名也是 数据库层中相应的类 
 
  截至到现在为止,整个过程才算是真的给运行出来,而且明白了!   
  思想上移,行为下移!   继续向下一个问题出发!  
   
   
 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐