VB三层结构设计示例
- 格式:doc
- 大小:49.00 KB
- 文档页数:6
网上用来写三层结构和Wcf的实例不多,本人最近因为工作需要,简单学习了三层结构和Wcf服务,这里用 (vs 2010)作一个简单实例,希望能帮助一些需要的人快速入门。
网上关于三层结构和Wcf的解释都太专业和高大上,这往往会初学者带来困难。
这里用一些个人的理解作一些粗浅说明,各位配合下面的例子写出自己的代码后,再返回去看他们的专业定义,也许会更容易理解些。
所谓三层结构,按我的理解,就是把一个软件的开发,分成三块,一块专门作界面,一块专门作业务流程,一块专门作数据操作。
这在团队开发中非常有用,可以分工合作,一人作一部分,将来出错也好查错,维护起来也方便,特别是系统庞大了以后,作用更明显。
当然,如果是个人作个小软件,个人觉得什么界面、业务、数据还是放在一起吧,分层浪费的时间更多。
所谓的Wcf,我的简单理解就是为了实现三层结构中的数据层。
就是作一个数据操作的DLL,然后在网上发布这个DLL,别人调用这个DLL中的函数来实现功能,而不用管DLL是怎么写的。
那为什么不直接在自己的代码中写呢,而是要发布Dll到网上呢?答案是为了数据安全。
比如你要调用sql server中的数据库,客户端中如果使用了连接的用户名和密码,别人可以简简单单挂个小程序就把你的用户名、密码就截获了;而使用了wcf,数据库连接语句都是在服务器上进行,客户端只获得了返回的结果,显然就安全多了(平时我们浏览网页也是这种模式),还有一个好处就是如果这个数据的逻辑发生变化,更新服务器的DLL 文件就好,不需要再更新客户端了,比如某个算法,由原来的X*0.2调整为X*0.3,这个时候你也要客户端和你一起更新?这显然不经济。
当然如果你是作单机版的软件,在本机上运行的,就没有必要学wcf了。
下面会讲到Wcf的建立和在IIS 5.1上的发布,大家慢慢往下看。
以下的图例就不再作详细的文字描述了。
一、打开vs 2010,新建一个解决方案,名字为test,存在e:\mytest下二、左上角菜单->文件->添加->新建项目->windows->windows窗体应用程序,名称:界面层四、左上角菜单->文件->添加->新建项目->Wcf->Wcf服务库,名称:数据层。
三层架构及实例演示简述通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问(DAL)。
实例 登录界面这是一个经过改版的登录,视频里的用c#来实现的。
使用的工具:sql server 2010 、vs 2010建立数据库:Login 表:Scores、UsersScore表Users表LoginModel(实体层)创建实体层LoginModel,建立Userinfo类,存储从UI返回的数据。
这里我们称为业务实体层,因为他也是为业务逻辑服务的。
[vb] view plaincopyprint?Public Class UserInfoPrivate _ID As StringPrivate _Username As StringPrivate _Password As StringPrivate _Email As StringPublic Property ID As IntegerGetReturn _IDEnd GetSet(ByVal value As Integer)_ID = valueEnd SetEnd PropertyPublic Property Username As StringGetReturn _UsernameEnd GetSet(ByVal value As String)_Username = valueEnd SetEnd PropertyPublic Property Password As StringGetReturn _PasswordEnd GetSet(ByVal value As String)_Password = valueEnd SetEnd PropertyPublic Property Email As StringGetReturn _EmailEnd GetSet(ByVal value As String)_Email = valueEnd SetEnd PropertyEnd ClassLoginBLL(业务逻辑层)UI层调用业务逻辑层来执行登录的操作。
vb结构化程序设计的三种基本结构1.引言1.1 概述概述部分将介绍VB结构化程序设计及其重要性。
VB(Visual Basic)是一种面向对象的程序设计语言,它强调程序的结构化和模块化,以便于代码的可读性和维护性。
VB结构化程序设计通过组织程序代码以一种逻辑和有序的方式,使程序更加易于理解、调试和修改。
在VB结构化程序设计中,有三种基本结构,即顺序结构、选择结构和循环结构。
这些基本结构的正确使用可以使程序具备更好的可控性和灵活性,使其能够适应各种复杂的应用场景。
顺序结构是指程序按照代码的排列顺序依次执行,没有任何条件判断或循环。
顺序结构使得程序的逻辑清晰明了,易于理解。
通过合理地安排程序的执行顺序,可以确保程序按照我们所期望的方式执行。
选择结构允许根据条件的判断来决定程序的执行路径。
根据条件的不同,程序可以选择执行不同的代码块。
选择结构使得程序具有决策能力,可以根据具体条件来作出不同的处理。
循环结构允许程序根据条件的判断来重复执行某段代码。
循环结构使得程序可以重复执行一些特定的操作,节省了代码量,并提高了程序的效率。
本文将重点介绍这三种基本结构的原理和使用方法,并提供一些示例代码来帮助读者更好地理解和使用VB结构化程序设计。
通过学习和掌握这些基本结构,读者将能够编写出更加清晰、可读性更高、可维护性更好的代码,提高程序的质量和效率。
1.2 文章结构文章结构部分的内容应该包括对整篇文章的组织和框架进行介绍。
下面是对文章结构内容可能的写法:在本篇文章中,我们将讨论VB结构化程序设计的三种基本结构。
为了使读者更好地理解这些基本结构,本文将按照以下结构组织:第一部分为引言,包括对整篇文章的概述、文章结构和目的进行介绍。
在概述部分,我们将简单介绍VB结构化程序设计的概念和重要性。
文章结构部分将解释本文的整体组织框架,并说明每个章节的主要内容。
目的部分将说明本文的写作目的和预期的读者受众。
第二部分为正文,将分别介绍VB结构化程序设计的三种基本结构。
浅谈如何建立三层体系结构的ASP应用程序随着互连网应用的深入和发展,三层体系结构的应用模式也得到更多人的青睐。
本文介绍了三层结构应用程序的概念和优点,并结合一个实例介绍了如何建立三层结构的ASP应用程序。
一、两层结构的ASP应用有何缺点在Browser/Server 应用程序开发领域,微软公司的IIS/ASP以其强大的功能,良好的扩展能力,及与其它微软产品的一致性,迅速地流行起来。
它能使一个具有VB/VC经验的程序员,很快地成为一个Web程序员,开发出看上去非常专业的应用。
但是,ASP有一个天生的缺点,就是ASP代码和HTML代码是混在一起的,ASP程序员既需要考虑与数据库打交道,需要关心如何与HTML配合,有时还需要用ASP直接生成HTML代码。
其结果是,当程序逻辑足够复杂时,.asp源文件非常长;而且,无论客户提出用户界面的改变,还是商业逻辑的改变(比如,在考试系统中,"合格"的标准可能从达到60分就算合格,改为进入前100名才算合格),都需要对.asp文件进行改动,而商业逻辑的改变,很可能需要改动很多文件。
二、三层结构的概念在传统的Client / Server应用中,也存在着上述同样的问题,多层结构的应用正是在对C/S 结构的总结基础上产生的,并且也已经扩展到了B/S应用开发领域。
即将应用划分为三层(可以有更多层,但三层最常见): 用户界面层,商业逻辑层,数据库层。
用户界面层负责处理用户的输入和向用户的输出,但并不负责解释其含义(出于效率的考虑,它可能在向上传输用户输入前进行合法性验证),这一层通常用前端工具(VB,VC,ASP等)开发;商业逻辑层是上下两层的纽带,它建立实际的数据库连接,根据用户的请求生成SQL语句检索或更新数据库,并把结果返回给客户端,这一层通常以动态链接库的形式存在并注册到服务器的注册簿(Registry)中,它与客户端通讯的接口符合某一特定的组件标准(如COM,CORBA),可以用任何支持这种标准的工具开发;数据库层负责实际的数据存储和检索。
有了这样的结构,上面的问题迎刃而解:还是以考试系统中的合格标准为例,在客户端所有需要显示合格人员名单的地方,调用这样一个函数GetQualifiedList,至于这个函数如何编写,如何与数据库打交道,以至访问的是何种数据库都与其无关(你一定有过这样的经历,在一种数据库系统上运行得很好的SQL语句,有时换到另一种数据库系统上必须加以修改); 在中间层DLL中实现这个GetQualifiedList函数,如果用户对"合格"的定义变了,只需要修改这个函数就可以了,只要此函数的入口参数和返回内容不变,在客户端不需作任何改动。
在这里,我们看到了面向对象编程的特性之一封装性的优点,而这一点在开发大型应用时尤其有用--我们可以把开发人员分成两组,一组负责开发界面层,另一组负责开发商业逻辑层,双方只要按照事先商定的函数接口,并行地开发就可以,而不必向从前那样,后面的工作必须等前面的工作完成后才能开始。
当然,这样的开发模式需要很好的项目协调和文档作支持。
你也许会问,如果我把这些函数些在一个单独的文件中,再在需要调用的地方把它包含进来,不是同样能达到目的吗? 第一,这种方法效率不高,无论你把这些函数分散到多少个文件中,当你需要调用其中一个时,总会包含进一些实际上并不需要的函数,这无疑加重了服务器的负担,对服务器性能要求较高的Web应用尤其如此。
而DLL只在需要时才调入内存且只调入需要的函数,并且多个应用程序实例可以共享同一个DLL实例;第二,设想一个员工,有20个属性(工号,姓名,年龄,性别......),现在给定某工号,要求返回此员工所有信息。
此时如果单纯用函数,只能定义20个全局变量,在函数中改变这些变量值,或者定义一个有20个传参(by reference)参数的函数。
显然,第一种方法很麻烦而一旦增加一个属性后一种方法就需要更改函数接口。
而在一个对象里,既包含成员方法(即函数和过程),也包括成员属性。
如果我们采用对象的方法,则在函数中只需要改变对象的属性,在函数外可以直接引用改变了的对象属性值。
这种方法有些类似第一种方法,但1.属性值无需在函数外逐一说明;2.这些属性值只属于对象,与对象无关的代码不会无意地改变属性值;3.一旦对象被释放,这些值会被一起释放。
三、如何开发三层结构的ASP应用程序ASP具有良好的扩充性,我们访问数据库时,采用的时ADO对象,访问文件时,采用的是文件系统对象(FSO),其实这时程序已经是三层结构的应用程序了,只不过由于是利用内置的对象而为意识到罢了。
这些对象都遵循COM/ActiveX接口,因此我们自己开发的对象也要遵循这个接口。
下面,我们就以上文提到的"合格"标准为例,演示如何创建自己的三层结构的ASP应用。
1、在数据库系统中建立如下数据库表:Employee: EMPLID char (5) not null,Name char (10) not null,Gender char (1) not null,Score int not null此表存储员工信息和考试成绩,为简单起见,这里只包含工号,姓名和性别三项,并且只有一门考试,EMPLID为主键。
2、建立动态链接库启动VB(这里以VB为例,你可以用你喜欢的任何支持ActiveX接口的开发工具开发),新建一工程,工程类型为ActiveX DLL。
在工程中新建一个类,取名为Employee。
你可以Class Builder可视化的向类中填加属性和方法,也可以直接手工编辑。
首先填加EMPLID属性如下:Private msEMPLID as stringProperty Let EMPLID(sEMPLID as string)msEMPLID=sEMPLIDEnd PropertyProperty Get EMPLID() as stringEMPLID=msEMPLIDEnd Property一般地讲,每一个属性都应该有Property Let和Property Get两个方法,它们分别当向属性赋值和读取属性值时被调用。
如果某个属性只被赋值而从不被读取(这种情况多发生在对应数据库表的主键的属性上),则Property Get方法可以省略。
Property Let方法不能省略。
你可以仿照上面的程序再建立Name,Gender和Score三个属性。
然后创建如下方法:Public Sub Create(EMPLID as string)dim conn as new Connectiondim rs as new Recordsetdim sql as string'Suppose that you create a DSN in the control panel, the connectionstring property'can also be dsn-less stringconn.ConnectionString="dsn=dsnname;uid=username;password=pwd"conn.opensql="select * from Employee where EMPLID='" & EMPLID & "'"with rs.open sql,conn,1,3if .eof and .bof thenexit subelsemsEMPLID=trim(.Fields("EMPLID"))msName=trim(.Fields("Name"))msGender=trim(.Fields("Gender"))msScore=.Fields("Score")end if.closeend withset rs=nothingconn.closeset conn=nothingEnd Sub这里根据EMPLID创建Employee对象,注意数据库中的值是赋给三个私有变量,而不是直接赋值给属性,如果你单步调试就会发现,给msEMPLID赋值会调用Property Let EMPLID,也就是给属性赋值。
下面我们再创建一个类Employees,并填加如下方法:private colQualifiedList as new Collectionprivate mnCurrentIndex as integerPublic Sub GetQualifiedList()dim conn as new Connectiondim rs as new Recordsetdim sql as string'Suppose that you create a DSN in the control panel, the connectionstring property'can also be dsn-less stringconn.ConnectionString="dsn=dsnname;uid=username;password=pwd"conn.opensql="select EMPLID from Employee where Score>=60 order by Score desc"with rs.open sql,conn,1,3if .eof and .bof thenexit subelsedo while not .eofdim oEmployee as new EmployeeoEmployee.Create trim(.Fields("EMPLID"))colQualifiedList.Add oEmployeeset oEmployee=nothingloopend if.closeend withset rs=nothingconn.closeset conn=nothingEnd Sub首先请注意VB中创建类实例的语法dim oEmployee as new Employee,后面会看到,在ASP中创建类实例的语法是不同的。
这个方法检索成绩大于等于60的员工工号,并据此创建一个Employee对象,再将此对象加入私有的集合对象中。
下面两个函数遍历集合中的元素: Public Function GetFirst() as Employeeif colQualifiedList.count>0 thenmnCurrentIndex=1set GetFirst=colQualifiedList.Item(1)elseset GetFirst=nothingend ifEnd FunctionPublic Function GetNext() as EmployeemnCurrentIndex=mnCurrentIndex+1if mnCurrentIndex>colQualifiedList.count thenset GetNext=nothingelseset GetNext=colQualifiedList.Item(mnCurrentIndex)End ifEnd Function也许你会说,为何不把集合声明Public,这样在ASP中不是可以直接引用吗?确实,这样也行得通,编程实现起来也更简单些,但是,这样做破坏了封装性原则。