上一篇写到了七层中B层、U层和外观层,下面就继续这个征程“欢迎乘坐本次列车,列车前方到站:七层(二),下一站列车停留30分钟,到达目的地的旅客请收拾好心情准备下车!30分钟内我将带各位参观"工厂"、观摩实体”。
首先来说实体层,就像上一篇中包图显示的那样,实体层的包上有五条线,这五条线代表的是其他层对它的引用关系,那么实体层是干什么的,引用又有什么用?下面一一道来:实体对象实际上是对应着数据库里的每张表的,我们把表里的字段封装在1个实体对象里 当你想用哪个字段 你就就通过该实体对象的get() set() 把那个字段提取出来 这比你临时创建1个变量要灵活的多 而且便于程序的维护和扩展.在实际的3层结构开发中,专门有个实体层,他的作用就是便于层和层之间的数据传递 .实体体现的是面向对象的方法,它实现了层之间的数据传递。这样说来引用这个关系的理解也就无师自通了,引用就像其它层和它之间的亲属关系,有了引用他们才是亲属,其它层才能和实体层之间更方便的“借用”数据。
说再多也是理论,下面就用登录窗体中的实体层来验证上面的理论吧:
Public Class LoginModel Private userID As String ‘登陆名 Private passWord As String ‘密码 Private level As String ’级别 Private name As String Private status As String Public Shared UserHead As String '设置全局变量 Public Shared UserLevel As String Public Property MuserID() As String Get Return userID End Get Set(value As String) userID = value End Set End Property Public Property MpassWord() As String Get Return passWord End Get Set(value As String) passWord = value End Set End Property Public Property Mlevel() As String Get Return level End Get Set(value As String) level = value End Set End Property Public Property Mname() As String Get Return name End Get Set(value As String) name = value End Set End Property Public Property Mstatus() As String Get Return status End Get Set(value As String) status = value End Set End Property End Class
而实体层中这些对应的恰好是对数据表中数据的封装,下面登陆的数据表:
正好是一一对应的,所以大家有没有对实体层有点理解了??
然后来看工厂层:
Imports System.Reflection '声明反射的命名空间 '必须先添加对接口的引用,否则IDAL会报错 Imports IDAL Public Class LoginFacy '对配置文件进行引用的代码 Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("strSqlConnection") Dim strAddWorkInfo As String = System.Configuration.ConfigurationSettings.AppSettings("strSqlConnection") Public Function CreateUserInfo() As IDAL.IUser 'IDAL的命名空间下的IUser接口 'CType:返回表达式显式地转换为指定数据类型、对象、结构、类或接口后的结果。 Return CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & "LoginDAL"), IUser) '当前“程序集”的名称是DAL;当前命名空间的名称是:DAL,要实例化的类名为,LoginDAL; End Function '将记录写入工作日志中 Public Function CreateWorkInfo() As IDAL.IWorkInfo Return CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & "WorkInfoDAL"), IWorkInfo) End Function End Class
就像上面代码显示的那样,工厂中声明反射空间、引用接口、使用配置文件。然后定义两个接口:CreateUserInfo(验证用户名)和CreateWorkInfo(用来将登陆记录写入工作记录),那么是不是就可以这样说:工厂用来生产程序所用到的接口,比如登陆用到的用户名和更新工作日志的接口。
说道工厂,我们就不得不提到它的姐妹:接口。接口也是一种抽象,它可以实现多个类的多重继承,而应用到机房中就是:接口用来对D层抽象,D层实现接口,当D层发生变化后,直接进行相应修改,接口也添加或删除某个东西就行了,而其他用到D的层不用看到D层发生了什么变化,因为它只关心D层给它什么东西,所以只要通过接口这个对D层抽象和封装的层就行。
在这里我们明确抽象类和接口的区别:接口是一种抽象类的变体,并且其中的方法全都是抽象的;下面看接口的代码:
Public Interface IUser '将LoginModel中user的值传递过来,传给User_Login Function User_Login(ByVal user As Model.LoginModel) As System.Data.DataTable '表示记忆体中资料的一个资料表 End Interface
Public Interface IWorkInfo '定义一个保存工作记录的方法,将WorkInfoModel中的workInfo值传递过来;作为布尔型,只有TRUE和FALSE两种 Function SaveWorkInfo(ByVal workInfo As Model.WorkInfoModel) As Boolean End Interface
这次的机房中用到很多新知识,更确切的是对旧知识的重新组装,所以我们需要更多的理解和归纳,现在还剩一个D层的介绍,大家先给自己点时间消化一下。下篇再见!