体系结构.NET开发

2024-08-28

体系结构.NET开发(共7篇)

体系结构.NET开发 篇1

1、框架设计目标

(1) 框架应具备较好的通用性, 能应用于大多数基于B/S和C/S模式的项目开发。 (2) 框架应具备较强的安全性, 能保障系统的稳定运行。 (3) 框架应该是分层设计, 各层组件可以部署在一台服务器上, 也可以部署在多个系统中, 从而使整个系统具有很好的可扩展性。 (4) 多个开发人员可以共享数据库的连接。因为数据库连接不是表示层直接实现的, 而是由中间层调用数据访问层完成的, 通过同一中间层就可以实现对数据库连接的共享。 (5) 如果业务发生变化, 确保可以重新部署所有程序。

2、框架体系结构

现阶段的系统开发大多是基于B/S或者C/S模式, 相应的表示层通常表现为web和winform方式, 为了体现出更好的灵活性和通用性, 本框架没有对表示层进行设计, 而是在表示层下面加入了应用接口层, 应用接口层提供了表示层和下层之间的接口, 体现了设计模式中的依赖倒转原则, 降低了程序各部分之间的耦合。

这样, 框架可以同时应用于windows应用系统和web应用系统中。对于传统数据访问控制层, 可以再分为数据服务层和数据库操作层。其中, 数据服务层封装了三种数据访问方式:本地访问、分布式远程访问和Web Service访问。为了实现不同数据访问方式的调用, 还必须加入核心调用层的设计。同时, 框架还加入了安全防护层, 确保系统具有较好的安全性。

(1) 表示层。表示层是客户端的用户界面, 负责从用户方接收命令, 请求, 数据, 传递给应用接口层处理, 最后将结果呈现出来。根据不同的需要, 表示层可以表现为web或winform方式。 (2) 应用接口层。应用接口层作为用户表示层和下层的接口, 负责给用户表示层提供组件的访问接口, 并且负责封装用户表示层传入的数据信息。同时, 表示层还可以作为隔离层, 将用户界面与各种业务功能的具体实现隔离开来。 (3) 核心调用层。核心调用层根据配置文件的配置信息, 确定所需要调用的服务方式, 启动数据服务层。 (4) 数据服务层。数据服务层封装了三种不同的数据访问方式, 分别为本地访问、分布式远程访问、Web Service访问, 并且通过.NET特有的反射机制, 动态调用相应的数据库操作。 (5) 数据库操作层。数据库操作层定义了数据库操作组件, 执行对应的数据库操作, 返回结果集。

3、框架中的配置管理规范

.NET多层开发框架中的配置管理规范主要由配置文件Envir onment Manager。config和配置文件管理类Environment Manager组成。配置文件Environment Manager。config为标准XML格式文档, 规定了框架中各种配置信息的读写规范, 其主要内容包括:数据库连接信息、数据服务层实现方式信息和服务器管理信息等。

数据库连接信息定义了数据库的路径、数据库名、连接密码等基本信息;数据服务层实现方式信息定义了框架中数据服务层的实现方式, 分为Local、Remoting、Web Service三种;而服务器管理信息定义了对服务器进行管理控制的相关信息, 供服务启动和数据操作层使用。

配置文件管理类Environment Manager负责管理配置文件, 包括配置文件的路径、配置文件加载、配置文件中对应的键值的获取、验证等功能。

4、框架中的数据传输与共享

按照基于设计模式的软件开发方式, 框架的设计应该遵循接口与实现分离的原则, 即使利用已有的模块, 只要知道它预定义的接口和实现的功能, 不用关心其实现的细节, 对于我们具体的实际应用来说, 应该保证在确定输入和输出数据的情况下, 尽量实现“黑盒重用”。因此必须预定义框架中数据的输入和输出形式, 可以设计一个通用的数据传输共享类, 用来传递数据, 需要实现的共享信息主要包括:系统信息、用户信息、用户操作信息、操作数据信息、返回数据集信息。根据需要将共享信息封装到两个类中:操作参数类和数据传递基类。

4.1 操作参数类

操作参数类Request Parameter由环境信息和用户操作信息组成, 用于向框架各层之间传递信息。环境信息包括系统信息和用户信息。这里的系统信息和用户信息包括系统时间、登陆系统的主机名称、IP地址、用户ID等。环境信息由配置文件管理类对象Environ ment Manager获取, 用于应用接口层向下传递给核心调用层。用户操作信息包括用户调用的框架类和具体操作信息。

4.2 数据传递基类

在对数据库的操作过程中, 一般是以Data Table的形式返回数据集信息。同时由于用户在进行数据库操作时, 需要传递不同的操作参数, 这样就可以设计一个数据传递类, 专门用于数据的传递。这里由于用户传入参数的不确定性, 只定义数据传递基类Base Appli cation Data, 具体某部分进行数据传递时, 继承基类的实现, 加入具体的参数即可。数据传递基类的实现主要包括两个方面:一是获得参数的抽象函数接口, 二是获得结果集的抽象函数接口, 可以通过继承的方式定义具体参数类型和结果集类型, 并且具体实现这两个函数。

5、结语

实践证明, 基于开发框架的应用开发模式和传统的开发模式相比, 在系统开发前期不需要投入较多精力进行系统框架的搭建, 只需要建立开发框架所需要的运行环境, 搭建好开发平台, 就可以在此基础上快速开发应用程序, 能很大程度上缩短项目开发周期。

摘要:Microsoft.NET是基于互联网的全新架构, 利用其提供的ASP.NET、ADO.NET和XML等组件, 以及Web服务, 开发基于.NET框架的应用系统。实践证明, 使用.NET框架可使应用程序的开发、部署及与其他网络系统集成变得更容易, 并可提高软件稳定性和安全性。

关键词:.NET框架,ASP.NET,ADO.NET

参考文献

[1]金正淑, 闰文耀, 陈亚军, 等.基于.NET技术的网上办公模型研究[J].计算机工程, 2010, 32 (12) :263-265.

[2]Tan Wei, Fan.Yushun.Dynamic Worldlow Model Frag—men-tation for Distributed Execufion[J].Computers in In—dustry, 2011, 58 (5) :381-391.

体系结构.NET开发 篇2

1.1 两层结构及其局限性

两层结构有如下特点:

数据库访问和用户类型判断逻辑放在一起实现。

用户界面层直接调用数据访问实现。

整个系统功能放在同一项目中实现。

传统的两层结构的特点是用户界面层直接与数据库进行交互, 还要进行业务规则、合法性校验等工作。两层结构软件模型如图1所示。

这种结构存在着很多局限性, 比如:一旦用户的需求发生变化, 应用程序都需要进行大量修改, 甚至需要重新开发, 给系统的维护和升级带来了极大的不便, 用户界面层直接访问数据库, 会带来很多安全隐患。为了克服两层结构的局限性提出了三层结构。

1.2 定义

所谓三层体系结构, 是在客户端与数据库之间加入了一个“中间层”, 也叫组件层。这里所说的三层体系, 不是指物理上的三层, 不是简单地放置三台机器就是三层体系结构, 也不仅仅有B/S应用才是三层体系结构, 三层是指逻辑上的三层, 即使这三个层放置到一台机器上。通用三层结构软件模型如图2所示。

中间层通常包括业务逻辑层、数据访问层和数据对象模型层。此时的三层结构软件模型如图3所示。

用户界面 (User Interface, 简称UI) , 也称表示层, 位于最上层, 用于显示和接收用户提交的数据, 为用户提供交互式的界面。表示层一般为Windows窗体应用程序或Web应用程序。

业务逻辑层是表示层和数据访问层之间沟通的桥梁, 主要负责数据的传递和处理。

数据访问层主要实现对数据的读取、保存和更新等操作。

数据对象模型层即业务实体层。主要用于表示数据存储的持久对象。在实际应用程序中的实体类是跟数据库中的表相对应的, 也就是说一个表会有一个对应的实体类。当然有些三层结构并不包含单独的数据对象模型层, 而将其功能分解到业务逻辑层和数据访问层之中。

在三层结构中, 表示层直接依赖于业务逻辑层;业务逻辑层直接依赖于数据访问层;数据访问层直接依赖于数据对象模型层。

1.3 优势

三层结构主要体现出对程序分而治之的思想:数据访问层只负责提供原始数据, 并不需要了解业务逻辑;业务逻辑层调用数据访问层提供的方法自定义一些业务逻辑, 对数据进行加工, 本身不需要了解数据访问层的实现;表示层直接调用业务逻辑提供的方法把数据呈现给用户。

三层结构的优点在于不必为了业务逻辑上的微小变化而迁至整个程序的修改, 只需要修改商业逻辑层中的一个函数或一个过程;增强了代码的可重用性;便于不同层次的开发人员之间的合作, 只要遵循一定的接口标准就可以进行并行开发了, 最终只要将各个部分拼接到一起构成最终的应用程序。

三层结构的应用程序将业务规则、数据访问、合法性校验等工作放到了中间层进行处理。通常情况下, 客户端不直接与数据库进行交互, 而是通过COM/DCOM通信与中间层建立连接, 再经由中间层与数据库进行交互, 这样会大大提高系统的安全性。

三层结构的应用程序更能够适应企业级应用日益增长的复杂度和灵活性的要求, 并且通过软件分层的高内聚、低耦合的原则, 实现扩展、维护和重用的要求, 可以大大提高开发效率。

2 搭建ASP.NET的三层结构框架

ASP.NET可以使用.NET平台快速方便地搭建三层结构。ASP.NET革命性的变化是在网页中也使用基于事件的处理, 可以指定处理的后台代码文件, 可以使用C#、VB作为后台代码语言。.NET中可以方便地实现组件的装配, 后台代码通过命名控件可以方便地使用自己定义的组件。表示层放在Web窗体中, 业务逻辑层、数据访问层和数据对象模型层用类库来实现, 这样就很方便地实现了三层结构。其方法如下。

(1) 建一个数据库 (简单起见可建Access数据库) , 以备存取数据。

(2) 新建解决方案

打开VS 2008, 新建一个“空白解决方案”, 将其命名为“Three Layers”。

(3) 搭建表示层 (网站)

在“解决方案资源管理器”中, 新建一个网站, 其存放位置为解决方案文件夹下的My Web子文件夹。

(4) 搭建业务逻辑层 (类库)

在“解决方案资源管理器”中, 新建一个“类库”项目。填写项目的名称为“Business Logic Layer”, 该项目用于实现业务逻辑。

(5) 搭建数据访问层 (类库)

在“解决方案资源管理器”中, 新建一个“类库”项目。填写项目的名称为“Data Access Layer”, 该项目用于实现数据访问层。

(6) 搭建数据对象模型层 (类库)

在“解决方案资源管理器”中, 新建一个“类库”项目。填写项目的名称为“Models”, 该项目用于实现数据实体。至此, 已搭建了三层结构 (添加了4个项目) 。

(7) 添加各层之间的依赖 (引用)

此时, 虽然三层结构的基本框架已经搭建成功, 但是各层之间是独立的。只有添加依赖关系, 才能让它们相互协作。

1) 添加表示层对业务逻辑层、数据访问层和数据对象模型层的依赖。

2) 添加业务逻辑层对数据访问层和数据对象模型层的依赖。

3) 添加业数据访问层对数据对象模型层的依赖。

至此, 三层结构及各层之间的依赖关系创建完毕。

(8) 将表示层设置为启动项目

通过上述步骤, 就已经成功部署了ASP.NET的三层架构。表示层My Web网站放置用于显示的Web页面;事务逻辑层Business Logic Layer项目, 把所有的业务逻辑代码在该层实现;数据访问层Data Access Layer项目主要处理数据库的操作, 供事务逻辑层调用;数据对象模型层Models项目实现数据实体类, 供其他各层调用。只要在各个层中实现具体的类就可以成功实施三层结构的应用程序了。

3 应用举例

3.1 系统分析

本例的功能非常简单, 只是实现用户登录与注册的功能, 用户信息存放在数据库中, 旨在体现如何用ASP.NET实现三层结构。

表示层My Web网站放置用于显示的Web页面;事务逻辑层Business Logic Layer项目, 把所有的业务逻辑代码在该层实现;数据访问层Data Access Layer项目主要处理数据库的操作, 供事务逻辑层调用;数据对象模型层Models项目实现数据实体类, 供其他各层调用。

各层次之间的调用 (引用) 关系如表1所示。

3.2 创建框架

3.2.1 建立数据库

打开Access创建名为userinfo.mdb的数据库, 并为其创建一个名为t_User的表, 其结构如图4所示。

3.2.2 新建解决方案

打开VS 2008, 依次选择“文件”→“新建”→“项目”命令, 打开“新建项目”对话框中, 然后选择项目类型为“Visual Studio解决方案”, 选择模板为“空白解决方案”。然后填写解决方案的名称为“Three Layers”, 并指定保存位置, 如图5所示。单击“确定”按钮, 创建解决方案。

3.2.3 搭建表示层

(1) 在“解决方案资源管理器”中, 在解决方案名称上单击鼠标右键, 在弹出的快捷菜单中选择“添加”→“新建网站”命令。

(2) 在打开的“添加新网站”对话框中, 选择“ASP.NET网站”, 选择位置为“文件系统”, 并设置网站的路径, 如图6所示。

(3) 设计Default.aspx如图7所示。

(4) 添加一Web窗体, 将其命名为Welcome.aspx, 其设计视图如图8所示。

(5) 添加一Web窗体, 将其命名为Register.aspx, 其设计视图如图9所示。

(6) 将建好的userinfo.mdb拷贝到站点的App_Data文件夹下。

(7) 添加Global.asax, 在其Application_Start () 添加如下代码。

3.2.4搭建业务逻辑层 (类库)

在“解决方案资源管理器”中, 在解决方案名称上单击鼠标右键, 在弹出的快捷菜单中选择“添加”→“新建项目”命令, 打开“新建项目”对话框中, 然后选择项目类型为“Visual C#”, 选择模板为“类库”。填写项目的名称为“BusinessLogic Layer”, 该项目用于实现业务逻辑。此时项目的保存位置已经默认输入了, 是刚才创建空白解决方案时产生的路径, 如图10所示。

3.2.5 搭建数据访问层 (类库)

在“解决方案资源管理器”中, 在解决方案名称上单击鼠标右键, 在弹出的快捷菜单中选择“添加”→“新建项目”命令, 打开“新建项目”对话框中, 然后选择项目类型为“Visual C#”, 选择模板为“类库”。填写项目的名称为“Data Access Layer”, 该项目用于实现数据访问层。此时项目的保存位置已经默认输入了, 是刚才创建空白解决方案时产生的路径。

3.2.6 搭建数据对象模型层 (类库)

在“解决方案资源管理器”中, 在解决方案名称上单击鼠标右键, 在弹出的快捷菜单中选择“添加”→“新建项目”命令, 打开“新建项目”对话框中, 然后选择项目类型为“Visual C#”, 选择模板为“类库”。填写项目的名称为“Models”, 该项目用于实现数据访问层。此时项目的保存位置已经默认输入了, 是刚才创建空白解决方案时产生的路径。

至此, 已搭建了三层结构 (添加了4个项目) , 此时的解决方案如图11所示。

3.2.7 添加各层之间的引用 (依赖)

此时, 虽然三层结构的基本框架已经搭建成功, 但是各层之间是独立的。只有添加依赖关系, 才能让它们相互协作。

(1) 添加表示层对业务逻辑层、数据访问层和数据对象模型层的依赖。

在“解决方案资源管理器”中, 在表示层上单击鼠标右键, 在弹出的快捷菜单中选择“添加引用”命令, 打开“添加引用”对话框, 然后选择“项目”选项卡, 选中项目名称为“Business Logic Layer”的项目, 单击“确定”按钮, 如图12所示。

同样添加对Data Access Layer和Models的引用。

(2) 添加业务逻辑层对数据访问层和数据对象模型层的依赖。

在“解决方案资源管理器”中, 在业务逻辑层上单击鼠标右键, 在弹出的快捷菜单中选择“添加引用”命令, 打开“添加引用”对话框, 然后选择“项目”选项卡, 选中项目名称为“Data Access Layer”的项目, 单击“确定”按钮。

同样添加对Models的引用。

(3) 添加数据访问层对数据对象模型层的依赖。

至此, 三层结构及各层之间的依赖关系创建完毕。现在Three Layers解决方案资源管理器应该如图13所示。

3.2.8 将表示层设置为启动项目

运行程序前, 还需设置启动项目。在“解决方案资源管理器”中的表示层上单击鼠标右键, 在弹出的快捷菜单中选择“设为启动项目”命令, 将表示层设置为启动项目。

将表示层设置为启动项目后, 表示层 (站点) 自动创建了Bin文件夹, 该文件夹下生成了:Business Logic Layer.dll、Business Logic Layer.pdb、Data Access Layer.dll、Data Access Layer.pdb、Models.dll和Models.pdb等6个文件, 如图14所示。

体系结构.NET开发 篇3

计算机应用系统通常是体系结构和技术的结合,它们所具有的一个共同点是其分布式本质。分布式系统是一个动态的计算机集合,这些计算机由网络连接到一起,运行专门设计的软件,为用户提供集成式计算机环境。分布式系统的范围包括从支持商业处理的单用途应用程序,到服务于大范围用户并具有广泛资源的全方位服务的计算机设备。

早期客户机/服务器模型是是两层C/S体系结构,在此体系结构中,既可以方便,统一地对数据进行管理,又可以合理有效地利用现有的硬件资源,平衡系统的负荷。但是两层的C/S结构并不能适用所有的情况,因为某些业务不能依赖软件厂家直接提供的功能,而必须定制,这样的程序很难进行移植。因此建立一种新的工作方式,进一步分离客户层,使客户机上的所有处理过程不直接操作数据库管理系统,这样就可以把客户端的处理分为应用程序和业务逻辑处理。这种处理导致了三层的C/S结构的出现。客户层负责可视化界面,进行人机交互处理;中间层进行业务逻辑处理;而服务器层则负责数据的管理。采用三层C/S结构有下述优点:1)可以对任务进行合理分配。2)有利于提高系统的性能,使中间层的业务逻辑处理与数据层的业务数据紧密结合在一起,而无需考虑客户的具体位置。3)添加新的中间层服务器能够满足新增客户机的需求,可以大大提高三层系统的可伸缩性。4)在客户机的应用程序和数据层的数据库之间增加中间层,可以使客户机的应用程序独立于数据层的数据库。5)可以将业务逻辑集中到一起,有利于系统的实施。

在三层系统体系结构中,客户层和数据层都己被严格定义,而中间层未明确定义。因为中间层包括了所有与应用程序界面和持久数据存储无关的处理,我们可以把中间层划分为许多服务程序,将每一个服务程序都视为独立的层,这样原来的三层体系结构就变为N层体系结构。典型的N层结构就是基于Web的应用程序,如图1所示。

由于客户/服务器应用程序跨越了多台计算机,所以需要TCP/IP或者IPX网络协议来连接应用程序的各个节点。N层系统需要更复杂的设备来实现跨网络的通信。因为在客户应用程序和中间层服务之间不能象2层系统那样以一种通用的结构方式实现;相反,客户应用程序需要一种通信模型,以协调客户应用程序的不同开发平台。这种模型即为客户应用程序的中间件。最早被广泛认同的中间件技术是远程过程调用,使用远程过程调用,客户应用程序可以调用在远程计算机上执行的C语言函数。

从分布式应用系统的角度来看,一个网络项目最少分三层:外观层、事物逻辑层、数据服务层。多层结构比两层结构具有更大的灵活性。首先,三层可以运行在不同的机器上,如果应用是业务逻辑比较复杂,可以使用高配置的计算机来运行业务逻辑层;如果应用的数据量很大,就可以采用分布式的数据库来作为应用的数据存储结构。其次,只要层与层之间的接口保持不变,那么某一层的变化不会影响到其他层,当层与层之间是松散藕合时,可以简单地替换组件(或整个一层),以适应变化了的需求。

分布式构架的网络整合平台,主要有Microsoft整合的Windows与因特网的平台一Windows DNA与Sun公司提出的基于Java2平台,由一系列中间件服务组合起来的J2EE(Java2Enterprise Edition)体系结构。

Windows DNA的全名为Windows Distribute Internet Architecture,即Windows的分布式互联网体系结构,是微软整合了Active X,WWW技术(如VBScript,DHTML等)平台的总称。微软利用IIS以及WWW作为系统前端来处理用户互动界面,以COM架构作为中间层来处理企业程序,以SQL Server作为后端储存数据的服务器,以实现三层式(Three-tier)或更多层系统的开发环境。三层式系统开发的好处在于,系统的界面、系统内部的程序以及企业后端的储存数据库可以分开。再者,因为整个系统是整构在网络上的,因此用户端只需有个普通的IE浏览器就可以在任何地方存取到系统,以减少最为繁杂的用户管理工作。

SUN所引导发起的J2EE体系则是一种利用Java2平台来简化诸多与多级企业解决方案的开发、部署和管理相关的复杂问题的体系结构。它是由一系列中间件服务组合起来的体系,J2EE作为中间件,提供了强大的服务功能,使开发人员只需要关注商业逻辑,而不需要注意其他的细节,因而能够加快开发速度,提高系统的运行效率和稳定性。J2EE技术的基础是核心Java平台或Java2平台的标准版。J2EE具有如“编写一次,到处运行”的特性,方便存取数据库的JDBC API、CORBA技术以及能够在Internet应用中保护数据的安全机制等等。

在Windows DNA之后,微软便开始将研究重心转到一个新的计划——NGWS(Next Generation Windows System,新一代的Windows系统)即微软所推出的.NET。Microsoft.NET是微软于2000年6月发布的下一代软件和服务战略,其目的是整合新的设备和技术,建立全新的网络协议和格式,协调众多的智能设备与网站,从而提供更简单,更为个性化,更有效的互联网服务。

2 NET的开发工具

.NET开发平台在开发人员用以创造应用程序的工具和技术上做了根本的变化。Visual Studio.NET就是微软公司为实现其.NET技术而开发的一整套工具组件,它提供了一个用于在该平台上创建应用程序的可视化集成开发环境(IDE)。集成开发环境是目前计算机语言产品都具备的一种工作环境,是进行程序设计的工作场所。在集成开发环境中,程序员可以对源程序进行编辑和编译,对目标程序进行调试运行。

2.1 Visual Studio.NET

2002年2月,微软发布了Visual Studio.NET(简称VS.NET)的最终版本,这是微软极力推荐的创建.NET应用程序的软件开发工具集。作为微软的下一代开发工具,它和.NET开发框架紧密结合,遵循.NET Framework,利用通用语言运行环境和公用层次类库提供加速开发过程的高效工具。VS.NET主要用于开发企业规模的Web应用程序以及高性能的桌面应用程序。

在开发网络应用程序时,以前开发人员只能在Web页中嵌入VB Script或J Script。现在,Web页可以用VS.NET中的任何一种语言来生成。IDE也提供了从Web表单控件中创造Web页的拖放式GUI(Graphical User Interface,图形用户界面),它是完全动态的,易于编码,能自动处理状态问题,根据浏览器兼容能力生成纯HTML,并且将用户界面问题和编码问题相分离。

在VS.NET环境中,所有控件的代码,包括格式化代码,都可以显示出来,这样便于高级开发者修改表单和控件的缺省行为,并且在应用程序的外观上给予它们更紧凑的控制。此外VS.NET还提供了完全集成的数据处理,尤其是XML和数据库集成,通过和数据源相连结合起来,大大简化了对来自不同种类的数据源的联合数据(例如将来自Oracle数据库的雇员数据合并到基于XML的销售成绩表中)的处理。使用.NET框架的开发工具,大大提高了开发者的效率,集成了多种语言支持;简化了服务器端的开发,提供了高效地创建和使用网络服务的方法,使开发人员能够快速构建和部署强健的、可靠的应用程序[1]。

2.2 C#

.NET开发框架支持多种语言,Visual C#.NET作为.NET Framework的主力开发语言,这是由C#的特点决定的[2,3,4]。

1)功能性和高效性。C#是Microsoft公司为推行.NET战略而发布的一种全新的编程语言,它的前身是C++语言。这种语言给开发人员提供了大量灵活的进行底层控制的能力,但这种灵活性是以开发的效率为代价的。比如指针操作引起的不安全因素,内存回收需要程序员介入等,使得用C++开发软件的困难程度比其他语言要高得多。由于与生俱来的复杂性和漫长的开发周期,开发人员都期望有新的、更好的开发语言,这种新的语言应能兼有功能灵活性和开发效率特点,融C++的强大和Visual Basic的简易于一体。

2)包容不断涌现的Web编程标准。在目前国际互联网应用日益广泛的情况下,越来越多的解决方案需要使用不断涌现的Web标准如超文本标识语言(HTML)、可扩展标识语言(XML)和简单对象访问协议(SOAP)等。现有的开发语言都是在Internet或者说是Web发展初期开发的,它们不可能提供适合于新的Web开发的技术支持。C#在保证了强大的功能和灵活性的同时,给C和C++带来了类似于VB的快速开发,并且它还针对.NET作了特别设计。C#可以快速的构建从底层系统级到高层商业组件,使用C#语言构建的这些组件,能够很容易的转换为Web Services,从而可响应来自Internet的与平台和开发语言无关的访问。XML是在Internet上传输结构化数据的标准方法,为了提高性能,C#允许XML数据直接映射为结构数据类型以代替类,这是一个处理少量数据的更高效的方法。这些特性结合起来使得C#成为优秀的下一代网络编程语言。

.NET为编写网络化仪器软件,提供服务器端脚本编写环境,使用它可以创建和运行动态交互的Web服务器应用程序,它能够把HTML、脚本、组件等有机地组合在一起,形成一个能够在服务器上运行的应用程序,创建以网页形式通过Internet发布的网络化仪器。在C#的Web编程中,可以用C#编写自己的服务器端组件,除了传统组件外,还包括那些具有特殊功能的可编程组件。使用它们可以更自由、更容易地进行数据绑定,具有强大的跨平台性。

3 结论

本文详细介绍网络化仪器的核心技术——.Net分布式技术,它基于分布式系统体系结构,采用.NET框架公共语言运行环境和.NET类库两个主要部件,并以Visual Studio.NET和C#为开发工具。

参考文献

[1]艾迪明.NET框架体系结构[J].计算机工程与应用,2003,(2).

[2]Adrian,等,著,王海峰,等,译,C#.NET Web开发指南[M].北京:机械工业出版社,2003.

[3]陆昆仑,等,著,用C#.NET开发网络服务[M].北京:希望电子出版社,2003.

ASP.NET开发基础概述 篇4

当一个HTTP请求到服务器并被IIS接收到之后, IIS首先通过客户端请求的页面类型为其加载相应的.dll文件, 然后在处理过程中将这条请求发送给能够处理这个请求的模块。在ASP.NET 3.5中, 这个模块叫做Http Handler (HTTP处理程序组件) , 之所以.aspx文件可以被服务器处理, 就是因为在服务器端有默认的Http Handler专门处理.aspx文件。IIS在将这条请求发送给能够处理这个请求的模块之前, 还需要经过一些Http Module的处理, 这些都是系统默认的Modules (用于获取当前应用程序的模块集合) , 在这个HTTP请求传到Http Handler之前要经过不同的Http Module的处理。这样做的好处一是为了一些必需的过程, 二是为了安全性, 三是为了提高效率, 四是为了用户能够在更多的环节上进行控制, 增强用户的控制能力。

2 ASP.NET性能优化

2.1 尽量使用静态HTML页面

ASP.NET开发的页面是先在服务器执行然后查询数据库返回数据最终生成HTML送到客户端, 这样来实现数据的动态交互, 运行起来非常方便。但这类程序不得不耗费一定的服务器资源。如果并发量大则肯定会导致服务器响应减慢。

而HTML静态页面是效率最高、消耗最小的页面, 因为它是直接存储在服务器硬盘中的, 当用户请求时, 服务器并不需要做任何处理, 而直接返回该页面, 这样性能消耗最小。因此对于访问量大的新闻频道类的网站, 信息内容的处理方法通常都在后台发布的时候直接生成静态HTML文件, 而不是每次访问都去读取数据库, 这样可以减少数据库的访问次数, 加快网站速度。

2.2 避免不必要的回送操作

在ASP.NET页面的Page_Load事件中的代码, 只要加载一次页面, 都会被执行一次。而按钮类控件比如Button等点击执行的时候, 都会执行回送操作, 这样会激发Page_Load事件而执行其中的代码, 但通常执行Button等点击类事件时, Page_Load事件中的代码是不需要执行的。因此ASP.NET机制中提供了Page.Is Post Back来避免对往返过程来执行不必要的代码。

2.3 关闭不必要的Session状态

Session在ASP.NET中的作用是保存用户的相关信息, 这些信息是保存在服务器端的, 主要用于授权机制。如果Session状态为开启, 则每次调用页面的时候, 都会首先查询Session状态, 虽然单个页面查询Session状态性能消耗小, 但是当并发量大, 访问页面非常多时, 这样显然会影响页面执行速度。因此如果该页面只是用于显示信息, 跟授权无关, 那么请关闭Session状态。比如一般CMS系统的前台页面是不需要Session的, 可以关闭它, 关闭Session的方法是在页面Page指令中加入如下代码:

2.4 关闭不必要的View State

View State在ASP.NET中的作用是保存数据在页面上, 每个对象都必须序列化到View State, 然后进行回传反序列化, 因此使用它是要耗费代价的。ASP.NET默认是开启View State的, 因此如果页面只是用于显示信息, 不用于表单交互, 则可以关闭它, 这样既可以减少View State序列化时耗费的性能, 又可以减小ASP.NET页面本身的体积大小。因为序列化的这些信息都会保存在该页面的HTML源代码中, 会增加页面的体积。

关闭的代码如下:

2.5 尽量在客户端进行用户输入验证

对ASP.NET用户输入进行验证的时候, 比如输入是否合法、是否是数字、格式是否正确、是否为空等, 采用服务器端C#代码来判断虽然非常地方便, 但是每次执行都需要送回服务器进行处理, 这样会大大影响系统的性能。在不必要的情况下尽量采用客户端验证, 比如ASP.NET提供了功能丰富的数据验证控件。

2.6 禁用调试模式

在发布网站之前, 需要始终牢记禁用调试模式。调试模式是在开发过程中用于开发人员调试程序使用的, 如果启用了调试模式, 则该网站的运行性能会受到非常大的影响, 当访问量小时感觉可能不太明显, 如果并发量大, 则网站性能会大大降低。

3 ASP.NET程序开发流程概述

3.1 需求分析

在整个项目中这块可以说是非常重要, 没有需求或者需求不明确, 那么开发人员将无从下手, 所以前期的需求调研是非常重要的, 如果在这块没有好好整理的话将会在后面遇到很多的问题。

3.2 数据库设计

当做好需求分析的时候, 下一个步骤就是搭建整个数据库, 可以说数据库是整个项目中最重要的角色, 一个优秀的数据库设计者就能从这里看出来。

在进行数据库设计的时候主键是必须的, 每个表都有其对应的主键, 而且主键最好用一个不相干的字段ID来表示, 这样方便我们在项目里面写代码。其他的就是一些命名之类的最好要见名知意, 不要使用汉字命名, 还有数据库的设计遵循三大范式。

3.3 编码

首先建立解决方案项目, 最后使用动软生成器生成相应的代码, 然后放到解决方案中, 修改bug, 使动软的代码可以运行, 最后建立web应用程序, 整个架构就是一个典型的三层架构。在各小组项目整合的时候, 如果前期不讨论如何弄的话在整和项目的时候将会遇到许多的问题, 这需要我们在Web应用程序中必须建立相应的使用外部文件的文件夹, 比如我们使用的JS文件我们可以放到Jquerys文件夹下面, css文件可以放到相应的style文件夹下面, 还有调用的dll我们可以放到lib文件夹下面。

动软生成的代码, 我们一般情况下不可以直接在里面操作, 因为那样的话如果数据库的结构变了, 我们需要重新生成代码, 将会覆盖我们的代码, 我们需要给DLL层的用户表里面添加一个分页的方法, 那么可以直接建立一个部分类LYSC_user Ext, 然后实现代码。

对于后台的实现, 后台是分角色写的, 个人有个人的模块, 所以后天的开发尤其能体现出来前面所说的内容, 因为后台分为用户管理、客户管理、企业文化、新闻和人才管理, 所以对应的每个角色都建立一个文件夹, 比如用户对应Users, 新闻对应news, 然后将该使用的easy UI文件夹行放到后台下面, 然后因为在后台用到了富文本编辑器, 所以将富文本编辑器的文件夹也放到下面, 这样就搭建好了整个系统的开发环境, 然后将这个文件发给我们的每个成员, 然后每个成员对应每个成员的开发角色, 在其相应的文件夹下面建立html, 一般处理程序和代码的书写, 在最后合并的时候我们只需要拷贝过来一个成员的文件夹复制到项目里面就行了。

3.4 调试测试

调试非常重要, 在写代码的时候就应该适当的调试, 比如那些很低级的错误, 文本框的长度, 邮件格式, 文本框不能为空等这些本来可以避免的Bug我们应该就不要让其发生, 所以我们在编写代码的时候就应该写完。调试测试最好由专业的团队进行测试, 最忌讳的就是自己测试自己的代码, 那样可能一些潜在的代码始终是测试不出来的, 所以等项目成型之后就要将自己开发的模块分给别人测试, 而你测试别人的模块, 这样使用黑盒测试一下基本通过, 这样一个网站算是成型了。

参考文献

体系结构.NET开发 篇5

在.NET环境下开发Windows服务并不是一件特别复杂的工作, 但在开发过程中有许多细节需要注意, 下文将通过开发一个简单的Windows服务来说明在开发Windows服务过程中应该注意的问题。

1 创建Windows服务项目

在VS2010中创建一个新项目, 选择Windows服务模板, 并将项目名称命名为My Service。在打开的解决方案资源管理器中, 我们可以看到Windows服务项目的文件结构和Windows窗体应用程序项目类似, 只是其中的Form1.cs文件被替换为了一个名为Service1.cs的文件。打开program.cs文件, 我们会看到如下代码:

Service Base类是所有用.NET Framework开发的Windows服务的基类。所有的Windows服务类均必须从该类中派生。在上述代码中, 调用该类的静态方法RUN用于在服务控制管理器 (SCM) 中注册服务器的可执行文件。SCM是操作系统的一个组成部分, 它的作用是与服务进行通信, 并对服务进行管理。下图阐明了这种通信处理序列图的方式。

如果将服务设置为自动启动, 则在系统启动时, 将启动该服务的进程, 进而调用该进程的主函数。服务负责为它的每一个服务都注册一个service-main函数。主函数是服务程序的入口点, 在这里, service-main函数的入口点必须用SCM注册。

2 编写服务代码

创建好Windows服务项目后, 我们需要在项目中添加自己的服务逻辑。双击默认的Service1.cs文件, 我们将看到一个类似于Windows项目的设计界面。注意, 切记不要向其中拖放可视化空间, 由于Windows服务不支持可视化界面, 如果拖入可视化控件, 可能造成服务崩溃。选择这个服务的属性, 可以打开Properties editor窗口。在其中可以配置如下值:

Auto Log指定把启动和停止服务的事件自动写到事件日志中;

Can Pause And Contiue、Can Shutdown和Can Stop指定服务可以处理暂停、继续、关闭和停止服务的请求;

Service Name是写到注册表中的服务的名称, 使用这个名称可以控制服务;

Can Handle Session Change Event确定服务是否能处理终端服务会话中的改变事件;

Can Handle Power Event选项对运行在笔记本电脑或移动设备上的服务有效。如果启用这个选项, 服务就可以响应低电源事件, 并相应地改变服务的行为。

在设计界面中单击右键, 并选择查看代码选项, 我们将看到如下代码:

On Start方法和On Stop方法是从Service Base类继承下来的方法, 我们必须对他们进行重写, 来实现我们自己的服务的业务逻辑。调用On Start方法将启动服务, 该方法的线程不能停滞下来, 必须尽快返回给调用者。这是因为SCM对服务管理得限制, 如果服务的初始化花费的时间过多, 则SCM就假定服务启动失败。为了解决这个问题, 我们通常会利用线程来处理服务的实际工作。On Stop方法与On Start方法类似, 该方法会再服务停止时被调用。

修改Service1.cs中的代码, 添加服务的业务逻辑:

在初始化方法中将业务逻辑绑定到线程上, 并在On Start方法中添加启动线程的方法。该示例完成了一检测QQ进程, 并关闭QQ进程的Windows服务。

3 服务的安装

在Service1的设计界面中, 单击右键, 并选择添加安装程序子菜单, 该操作会向项目文件中添加一个名为Project Installer.cs的文件, 该文件中主要包含了Service Installer和Service Process Installer两个组件。这两个组件均派生于Component Installer类。其中Service Process Installer用于配制进程, 为这个进程中的所有服务定义值, 而Service Installer用于服务的配制, 因此, 每个服务都需要Service Installer类的一个实例。如果进程中有3个服务, 则必须添加额外的Service Installer对象。

在属性窗口中将Service Installer组件的Start Type属性设置为Automatic, 该属性的作用是设置服务的启动方式, 在这里将其设置为自动启动。将Service Process Installer的Account属性设置为Local System。Acount属性的作用是用于配制安装服务时, 使用的权限, 在这里我们使用了本地系统上的用户账户。

配制完安装相关的属性后, 在生成菜单中选择生成解决方案子项, 这时将在项目的目录中生成服务的EXE文件, 注意, Windows服务与普通应用程序不一样, 在操作系统中安装注册以前无法直接进行调试运行, 所有不要直接使用F5运行。

4 编写批处理文件, 安装运行Windows服务

在项目中添加2个文件如下 (必须是ANSI或者UTF-8无BOM格式) :

1) 安装脚本Install.bat

2) 卸载脚本Uninstall.bat

这两个脚本文件使用了installutil.exe使用程序来安装和卸载服务, 这个使用程序可以用于安装包含Installer类的所有程序集。Installuntil.exe使用程序调用派生自Install类的Installer () 方法进行安装, 调用Un Installer () 方法进行卸载。该程序在安装Framework时安装到系统目录下。

5 结语

本文研究了在.NET环境下使用C#语言开发Windows服务的一般方法, 并使用一个简单的案例阐述了Windows服务的开发步骤。在阐述过程中介绍了.NET中实现Windows服务的相关类的使用方法, 以及在开发Windows服务时应注意的的一些细节。通过阅读本文让读者能够轻松的开发自己的Windows服务项目。

参考文献

[1]内格尔, 埃夫琴等著.C#高级编程[M].北京:清华大学出版社, 2010.11.

[2]Mc Connell.代码大全.电子工业出版社[M], 2006.3.

基于.NET的Web服务开发 篇6

网络技术的逐步成熟、开发技术和开发工具的逐步完善, 使得分布式应用软件系统的开发与应用越来越普及。这里的"分布"是指通过网络支持, 将数据和处理分散到不同的系统或平台上, 达到简化客户端需求、整合处理资源、实现数据和处理共享、方便开发和维护等目的。现在已经获得广泛应用的网站发布与浏览系统、MSN/QQ及时通信系统、Email收发系统、移动通信中的短消息系统等等, 都是典型的分布式应用系统类别。

在.NET下进行程序的开发, 运用三层架构可以让代码的可读性和功能的扩展性有着很好的提高。三层架构分别是数据访问层DAL (Database Access Layer) , 业务逻辑层BLL (Business Logic Layer) , 用户表现层 (用户接口层) UIL (User Interface Layer) 。

数据访问层:有时候也称为是持久层, 其功能主要是负责数据库的访问。简单的说法就是实现对数据表的Select, Insert, Update, Delete的操作。

业务逻辑层:是整个系统的核心, 它与这个系统的业务 (领域) 有关。业务逻辑层的相关设计, 均和项目特有的逻辑相关, 例如查询XX, 下订单XX, 添加宠物到购物车XX等等。如果涉及到数据库的访问, 则调用数据访问层。

表示层:有时候也称为用户接口层, 是系统的UI部分, 负责使用者与整个系统的交互。在这一层中, 理想的状态是不应包括系统的业务逻辑。表示层中的逻辑代码, 仅与界面元素有关。

图1中的 (1) 和 (2) 就是三层结构大体的样子。它的好处是结构清楚, 功能模块清晰, 出现异常能迅速定位排除。这种模式开发出来的代码非常美观, 简洁, 阅读方便。

二、Web服务

Web服务 (Web Service) 是一种可以用来解决跨网络应用集成问题的开发模式, 这种模式为实现"软件作为服务"提供了技术保障。而"软件作为服务"实质上是一种提供软件服务的机制, 这种机制可以在网络上开放可编程接口, 并通过这些接口来共享站点开放出来的功能。

通俗的讲, Web服务就是一个应用程序, 它向外界开放出一些能够通过Web进行调用的API, 使开发者能够通过用编程的方法调用这些接口, 来实现一些特定的软件功能, 从而简化开发。

有了Web服务, 只需要在自己的程序中通过访问某个服务的URL地址, 得到一个接口文件。然后, 在实际编程中, 只需要通过这个接口文件来访问服务就可以了。一定要注意, 这个服务既可以运行在我们本地的机器上 (Local host) , 如图1中的 (3) 就是建立在本机上的Web服务的开发;也可以是运行在上互联网上URL地址所指向的地方, 如图1中的 (4) , 尤其以后一种方式居多。

如果项目需要更多的功能, 如查询城市的天气预报或查询股票信息, 而这些功能在一些网站上已经被开发出来, 并以各种方式 (免费或收费) 公开出来供所有需要它们的开发人员来使用, 那么, 尽量使用它们好了。当然, 如果开发人员所在的公司, 也想成为Web服务提供者的话, 同样可以轻松地将他们编写的Web服务在网络上公布出来, 供大家使用。

三、开发环境

Visual Studio 2008 (简称VS2008) 是面向Windows Vista、Office 2007、Web 2.0的下一代开发工具, 代号"Orcas", 经历了大约18个月的开发, 是对Visual Studio 2005一次及时、全面的升级。

VS2008引入了250多个新特性, 整合了对象、关系型数据、XML的访问方式, 语言更加简洁。使用VS2008可以高效开发Windows应用。设计器中可以实时反映变更, XAML中智能感知功能可以提高开发效率;同时支持项目模板、调试器和部署程序。VS2008可以高效开发Web应用, 集成了ASP.NET、AJAX 10, 包含ASP.NET AJAX项目模板, 它还可以高效开发Office应用和Mobile应用。

四、基于本地Web服务的应用程序设计

使用VS2008设计基于本地Web服务的应用程序, 是指用户表示层调用的不是本地的三层架构中的业务逻辑层, 而是引用Web服务来实现相关的功能。这里我们使用上面建立的解决方案来进行开发, 主要用到表示层Web UI和Win Form UI两个项目。具体步骤如下:

建立本地Web服务。打开解决方案资源管理器, 右键单击解决方案"Web App", 选择"添加"--"新建网站"。

在"新建网站"对话框中, 选择模板"ASP.NET Web服务", 语言选择"Visual C#", 位置选择"文件系统", 并将后面的地址信息由"D:ProjectWeb AppWeb Site1"更改为"D:ProjectWeb AppWeb Server"。点击"确定"按钮, 新增Web服务完毕。

VS2008在网站"Web Server"中的默认服务文件"Service.cs"中, 已自动添加一个Web方法Hello World () , 我们在Hello World (方法后面可以继续新增方法。

添加对本地Web服务的引用。在解决方案资源管理器中, 右键单击想要引用Web服务的项目, 比如用户表示层项目"Web UI", 选择"添加Web引用"。

在出现的"添加Web引用"对话框中点击"此解决方案中的Web服务" (也可以在URL输入框中输入本地机器的Web服务地址, 然后点击"前往") 。

单击本解决方案中可用的Web服务"Service"。

图2列出了此服务中定义的所有Web方法。上方的URL下拉框中列出了此Web服务所在的地址, "Web引用名"使用默认引用名即可, 单击"添加引用"按钮。

五、基于Internet远程Web服务的程序设计

和第四部分"基于本地Web服务的应用程序设计"类似, 也可以使用VS2008设计基于Internet的远程Web服务的应用程序。这里使用上面建立的解决方案来进行开发, 实现全国各大城市的天气预报查询功能。主要用到表示层Web UI项目。具体步骤如下:

(1) 查找可使用的稳定的远程Web服务。通过"Google"或者"百度"可以搜索到互联网上很多免费的Web服务, 根据自己的需要进行选择。这里选择一个天气预报的Web服务, Web服务的地址为:http://www.webxml.com.cn/Web Services/Weather WebService.asmx。

(2) 在解决方案资源管理器中, 右键单击"Web UI"项目, 选择"添加Web引用"。

在弹出的"添加Web引用"对话框中的URL输入框中输入上面的Web服务地址:http://www.webxml.com.cn/Web Services Weather Web Service.asmx, 单击"前往"按钮。

对话框列出了此服务中所有定义的所有Web方法和相关的说明, 如图3所示, 这里我们选择调用get Weatherby City Name方法来实现根据城市名称获取该城市的天气情况。"Web引用名"使用默认引用名即可, 单击"添加引用"按钮, 会在"Web UI"项目中添加一个"App_Web References"文件夹, 并加入了所有相关的资源。

get Weatherby City Name方法:根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数。

五、总结

通过对于分布式软件开发体系的介绍, 我们了解了常见的分布式软件开发模型和分布式开发的强大功能和优势, 并在此基础上介绍了Web服务开发, 通过一个具体实例的演示可以看出, 在VS2008环境中, 实现基于分布式的Web服务开发是非常简捷的。对于初学者提供了很大的方便。

摘要:本文介绍了分布式系统和Web服务的概念, 并分析了分布式系统的开发模式, 并通过基于本地的和基于Internet的两种Web服务的开发进一步体现了分布式开发和Web服务的优越性。

关键词:分布式开发,Web服务

参考文献

[1]《Web服务:原理和技术》, (荷兰) 帕派佐格罗 (Michael P.Papazoglou) 译者:龚玲张云涛, 机械工业出版社, 2010年01月

[2]《C#与.NET 3.5高级程序设计 (第4版) 》, (美国) 特罗尔森 (Andrewtroelsen) 译者:朱晔肖逵张大磊, 人民邮电出版社, 2009年03月

[3]《Visual C#2008从入门到精通》, (英国) 夏普 (John sharp) 译者:周靖, 清华大学出版社, 2009年01月

体系结构.NET开发 篇7

本文要讨论的是,如何利用.NET Framework有关打印的类,对打印输出进行精确及任意的控制。System.Drawing.Printing命名空间中包含各种有关打印及其控制的类,可用于扩展和自定义打印功能。这些类之间的关系比较复杂,为便于叙述和理解,现从打印逻辑、打印设置、页设置和打印预览等四个方面来加以阐述。

1 打印逻辑

打印逻辑指的是,对于要打印的文档,按需要的内容与格式提供编排和分页等基本的打印功能。

本文示例代码的功能是,从Access的数据库db的表People中,读出所有人员的记录,并按图1的格式进行打印或预览。作为示例,人员记录中包含姓名、性别、民族、联系地址和照片文件名等信息。

PrintDocument类,可实现打印逻辑。该类的实例表示要打印的文档,通过它既能输出文字,也能输出图形图像;可以指定文本的字体及颜色,也能指定输出的位置。每当本页结束时还可以视情况激活下一页。

既可以直接使用PrintDocument类,也可以从PrintDocument类派生新类。

1.1 直接使用PrintDocument类

创建PrintDocument对象后,需要将其BeginPrint、PrintPage和EndPrint等事件关联到相应的处理方法,然后调用其Print()方法,即可启动打印作业。如下列代码所示:

PrintDocument pd=new PrintDocument();

pd.BeginPrint+=new PrintEventHandler(pd_BeginPrint);

pd.PrintPage+=new PrintPageEventHandler(pd_PrintPage);

pd.EndPrint+=new PrintEventHandler(pd_EndPrint);

pd.Print();

调用Print()方法,会依次引发事件BeginPrint、PrintPage和EndPrint,正是要利用这三个事件的处理方法来实现打印逻辑。如下所示:

void pd_BeginPrint(object sender,PrintEventArgs e){

//初始设置

}

void pd_PrintPage(object sender,PrintPageEventArgs e){//

//格式化绘制

}

void pd_EndPrint(object sender,PrintEventArgs e){

//释放资源

}

1.2 继承于PrintDocument类

事实上,从PrintDocument派生类是推荐的做法。在派生类中,只要重写基类PrintDocument的OnBeginPrint、OnEndPrint和OnPrintPage方法来实现打印逻辑,而不需要处理BeginPrint、EndPrint和PrintPage等事件。派生代码示例如下:

public class MyPrintDocument:PrintDocument{

//定义新成员

protected override void OnBeginPrint(PrintEventArgs e){

base.OnBeginPrint(e);

//初始设置

}

protected override void OnPrintPage(PrintPageEventArgs e){base.OnPrintPage(e);

base.OnPrintPage(e);

//格式化绘制

}

protected override void OnEndPrint(PrintEventArgs e){base.OnEndPrint(e);

base.OnEndPrint(e);

//释放资源

}

}

可用以下代码启动打印作业:

MyPrintDocument pd=new MyPrintDocument();

pd.Print();

由此,将依次引发调用OnBeginPrint、OnEndPrint和OnPrintPage等方法。

1.3 实现打印逻辑

打印逻辑的实现可分为初始设置、格式化绘制和资源释放等三个阶段。对于PrintDocument基类,要处理三个相关事件;而对于PrintDocument派生类,则要实现三个相关的方法。

1)初始设置

可在BeginPrint事件或OnBeginPrint方法中进行初始化,包括设置文本的格式化对象StringFormat、字体对象Font、访问数据库的ADO.NET相关对象DbConnection、DbCommand及DbDataReader等。示例代码如下:

con.Open();

事件BeginPrint或方法OnBeginPrint,都带有PrintEventArgs类型的参数e,其Cancel属性如果设为true,可用于取消打印作业。一般将其赋值为DbDataReader实例的Read()方法的返回值,表示如果数据记录为空,则立即终止打印。

2)格式化绘制

PrintPage事件或OnPrintPage方法,在生成报表的每一页时都会被引发或调用。应在其中为每页进行绘制,包括文字、图形或图像。关键代码示例如下:

//绘制单元格

e.Graphics.DrawRectangle(Pens.Black,rect);

//绘制从数据库中读取的文字

Font font=new Font("华文行楷",9);

e.Graphics.DrawString(text,font,Brushes.Black,rect,format);

//从数据库中获取图像文件名并绘制其图像到指定区域中

e.Graphics.DrawImage(img,rect);

//读取下一条记录,如果存在则开启下一页

注意:参数e属于PrintPageEventArgs类型,该参数含有很多与打印控制有关的属性,其中最重要的三个属性是:Graphics、MarginBounds和HasMorePages。

属性Graphics引用了一个GDI+对象,它提供了绘制文本、图形和图像等各种绘制方法。比如:方法Graphics.DrawLine用于绘制直线;方法Graphics.DrawRectangle用于绘制矩形;方法Graphics.DrawString用于绘制文本;方法Graphics.DrawImage用于绘制图像。

属性MarginBounds引用一个Rectangle对象,它表示可绘制区域。其Left、Top属性分别表示页上的左边距和顶边距,实际上可作为绘制位置的参考基准。

属性HasMorePages表示还有没有下一页。如果有下一页,应设为true;否则,应设为false。可将该属性赋值为DbDataReader实例的Read()方法的返回值,表示当读取下一条记录时,如果有下一条记录就开始下一页;否则打印结束。

3)释放资源

EndPrint事件或OnEndPrint方法在打印结束时被引发或调用,处理代码如下:

reader.Close();

connection.Close();

用于关闭在BeginPrint事件或OnBeginPrint方法中生成的相关对象,并释放所占用的系统资源。

2 打印设置

PrintDocument类具有PrinterSettings属性,该属性引用一个PrinterSettings类的实例。通过该实例可以对打印机、或对文档总体进行设置。比如,可用PrinterSettings.PrinterName属性来指定要使用的打印机;而使用PrinterSettings.PrintRange属性来指定文档中想要打印的页的范围;使用PrinterSettings.Copies属性来指定想要打印的文档份数。如下列代码所示:

通常,应用程序应该实例化PrintDialog类,它可为用户提供一个打印设置对话框,从而可视化地设置PrinterSettings属性。如下列代码所示:

执行以上代码将弹出打印设置对话框(图2),用户可在其中设置打印机、打印范围以及打印份数。当用户点击【确定】按钮时,则开始打印。

3 页设置

PrintDocument类含有属性DefaultPageSettings,它引用一个PageSettings类的实例。通过该实例可以对页面进行设置,此设置就作为所有页的默认设置。比如,可用PageSettings.Color属性指定是否应用彩色打印,可用PageSettings.Landscape属性指定是横向打印还是纵向打印,而PageSettings.Margins属性指定页边距。如下列代码所示:

通常,应用程序应该实例化PageSetupDialog类,它可为用户提供一个页设置对话框(如图3所示),以方便用户可视化地设置DefaultPageSettings属性。如下列代码所示:

setPage.ShowDialog();

4 打印预览

实例化PrintPreviewDialog类,并设置其Document属性为已定义过打印逻辑的PrintDocument类的实例,即可为其提供预览功能。如下列代码所示:

ppd.ShowDialog();

PrintPreviewDialog对象在内部自动生成了PrintPreviewControl对象,正是该对象实际提供了预览的能力。可通过PrintPreviewControl对象对预览效果进行更多的控制。

弹出的预览对话框,如图4所示。

5 结束语

运行结果表明,基于.NET框架专用报表技术的设计方案正确,按照该方案实现的报表打印功能也是成功的。当然,该方案的目标只是讨论专用报表技术,因此它必须针对特定应用程序进行设计和应用。

与传统报表技术相比,该报表技术性能更好,使用成本很低,可进行精确控制,适用性、灵活性非常强。运用该报表技术,可使应用软件实现结构紧凑、短小精干的目标。该技术可广泛应用在特定行业、特定应用程序上进行专用报表,尤其适用于进行单据、车船机票、发票等凭证的打印。

摘要:针对实际应用中各种报表打印的不同需求和诸多不便,对.NET框架打印控制技术进行了深入研究,分析了有关打印控制的类及其使用方法,结合对数据库中数据的访问,系统地阐述了.NET平台上开发专用报表的打印控制技术。实际运用结果表明,该技术对打印的控制精确灵活,占用系统资源少,也大大节约了应用成本。

关键词:.NET框架,报表打印,打印控制,Printing命名空间,打印逻辑,打印设置,页设置,打印预览

参考文献

[1]Andrew Troelsen.C#与.NET3.5高级程序设计[M].北京:人民邮电出版社,2009.

[2]Microsoft.MSDN文档[EB/OL].http://msdn.microsoft.com/zh-cn/library.

[3]Alex Calvo.利用.NET Printing命名空间从Windows窗体应用程序中进行预览和打印[EB/OL].(2004-12-13).http://msdn.microsoft.com/zhcn/library/aa686055.aspx.

[4]梁亚雄,魏维,韩天明.打印监控中的关键技术研究[J].计算机应用与软件,2012,29(10):314-317.

[5]张胜兰,杨朝阳.一种实现小幅面工程图拼排打印的方法[J].计算机应用与软件,2008,25(9):172-173.

[6]戚玮玮,宋朝辉,宋大雷,等.BS模式下条形码票证自定义打印的设计和实现[J].计算机应用与软件,2010,27(12):170-173.

[7]郭军军,刘刚.一种基于J2EE平台的通用WEB票据打印服务技术[J].计算机应用与软件,2010,27(6):163-164,168.

上一篇:P2P僵尸网络研究下一篇:普适文化