计算机系毕业设计论文 个人博客系统设计与实现_第1页
计算机系毕业设计论文 个人博客系统设计与实现_第2页
计算机系毕业设计论文 个人博客系统设计与实现_第3页
计算机系毕业设计论文 个人博客系统设计与实现_第4页
计算机系毕业设计论文 个人博客系统设计与实现_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、毕业设计毕业设计(论论文文)中文摘要中文摘要 题目:个人博客系统设计与实现 摘要:从发展之初,博客就带有双重功能,一方面它是很棒的在线写日志的工具, 它可以记录个人的文章、日记或者其他一些值得记录分享的东西;另一方面博客 也是绝佳的交流工具,利用博客可以发一些重要的新闻,以最直接、最高效的方 式来与他人沟通。2000 年博客开始进入中国,并迅速发展,一直到今天博客应用都 非常广泛。 现在 Web 开发的理念就是追求较好的用户体验,一般都体现在 RIA(Rich Internet Application)开发上。一些老的技术已经不能满足当今 Blog 发展的需 求,利用一些新的技术如 Silve

2、rlight、WCF、Ajax 等来开发一个新的 Blog 系统 就是基于这样的背景。 本课题的任务是利用一些新的技术来开发一套完整的 Blog 系统,主要技术有 WCF、Silverlight、Ajax 等,是基于.NET 3.5 的平台来开发的。整个系统是基于 传统的三层架构的一套系统。数据访问层对 ADO.NET 进行了进一步封装,利用 Ioc 容器注入、反射来动态加载对象,同时利用缓存提高整个系统的整体性能。UI 层 利用了一些比较成熟的库和插件,比如 jQuery 库、FCKeditor 富文本编辑插件等, 同时也利用了一些比较新的技术,如 Silverlight。整个系统界面采用

3、Div + CSS 来设计界面,共有两套主题可供选择。 最后经过测试,系统能正常运行,功能完善,性能较高。总得来说这个系统 的开发是比较成功的。 关键词:博客 三层架构 WCF Silverlight 对象设计模式 缓存 毕业设计毕业设计(论论文文)外文摘要外文摘要 TitleTitle : : Design and Implementation of a Personal Blog System AbstractAbstract: From the start, The Blog has two functions, first, its a useful tool who can use

4、to write articles, diary or something valuable to record and share with others, second, it is also a good tool to communicate with other people, we can use the most direct and most efficient way to publish some latest news to communicate with other people. In the year of 2000, the blog came to China

5、, and spread quickly, grow rapidly,until now, it is also used extensively. The concept of todays web develop is users experience, mainly be embodied in the RIA(Rich Internet Application) developing. Some old technology cannot meet the todays Blogs development. Base on these reasons, we have to devel

6、op a new system which using some new technology, for example, Silverlight, WCF, Ajax. This topics task is to develop a new Blog system using some new technology. Primary technology is WCF, Silverlight, Ajax and so on. This project is base on the .NET 3.5. This entire system is base on the three laye

7、rs architecture. Data access layer encapsulate ADO.NET further, and load object dynamically using Ioc dependency injection and reflection. The system use cache to cache data to improve performance. UI layer uses some proven technique, for example, jQuery and FCKeditor rich text editor plugins, and a

8、lso uses some new technology, for example Silverlight. We use div + css to layout the web page. It has two themes. After testing, the entire system has a good running. It is finished successfully. Keywords:Blog Three Layer Architecture WCF Sivlerlight Design Pattern Cache 目 录 1 绪论.- 1 - 1.1 博客概况.- 1

9、 - 1.1.1 博客的产生 .- 1 - 1.1.2 博客的现状 .- 2 - 2 系统设计与实现.- 3 - 2.1 需求分析.- 3 - 2.1.1 功能需求 .- 3 - 2.1.2 项目计划安排 .- 3 - 2.2 系统开发环境.- 4 - 2.2.1 开发环境简介.- 4 - 2.2.2 Visual Studio 2008 开发环境简介.- 5 - 2.2.3 SQL Server 2005 数据库简介.- 5 - 2.3 相关技术简介.- 5 - 2.3.1 C#语言简介 .- 5 - 2.3.2 ASP.NET 简介 .- 6 - 2.3.3 ADO.NET 简介 .- 6

10、 - 2.3.4 Silverlight 技术简介.- 7 - 2.3.5 WCF 简介.- 7 - 2.3.6 jQuery 库简介.- 8 - 2.4 系统设计与实现.- 8 - 2.4.1 分层架构核心思想 .- 8 - 2.4.2 实体介绍 .- 9 - 2.4.3 数据库设计 .- 10 - 2.4.4 实体类的设计与实现 .- 12 - 2.4.5 接口设计 .- 12 - 2.4.6 IoC 容器及依赖注入机制的设计 .- 14 - 2.4.7 数据访问层的实现 .- 17 - 2.4.8 业务逻辑层的实现 .- 24 - 2.4.9 表示层的实现 .- 26 - 2.4.10

11、视频模块的实现 .- 28 - 3 小结.- 36 - 1 1 绪论绪论 忽如一夜春风来, “上网”突然成了很“cool”的事,网上影院、伊妹儿、QQ、黑 客越来越多的网络语言融入了我们的日常用语,网络成了我们生活一部分。电脑起源 于二战,而网络则不折不扣的起源于冷战。网络的正常稳定发展是从 1995 年以后,从 1995 年到至今,短短的十几年间,Internet 进入了全速发展时期,它已经成为我们生活中 不可缺少的重要一环了。 Internet 规模逐日扩大,人们对网络速度的要求也越来越高。信息的获取、处理、交 流和应用能力,已经成为人们最重要的能力之一。而在网络上,发布、查看相关信息的方

12、式 也越来越多,比如门户网站,新闻组,电子邮件,还有最近几年流行起来的 BBS, 博客, 播客,贴吧等等。博客是一种基于互联网分享个人心得及其他一些个人认为是有用信息的 方式。从发展之初,博客就带有双重功能,一方面它是很棒的在线写日志的工具,另一方 面也是绝佳的交流工具。 1.11.1 博客概况博客概况 1.1.1 博客的产生 “博客”这个词,最早起源于中国,史学界普遍认为最早来自于中国秦代。当时张良 为了刺杀秦始皇,找到一位侠客,并选定博浪沙作为刺杀地点,结果刺杀失败。但大秦帝 国还是被这一突发事件所震惊,纷纷在第一时间予以报道。无数竹简在驿道上往返奔驰, 上面的新闻只刻着一行朱色的篆字:“

13、博浪沙之侠客。 ”由此可见, “博客”的最初含义是 指突发性大事件。后来这个词的意义被进一步引申,代指“值得一看的东西” 、 “另人震惊 的事件”或“富有新闻价值的言论” 。 最古老的博客原型是 NCSA 的“Whats New Page”网页,主要是罗列 Web 上新兴的网 站索引,这个页面从 93 年 6 月开始,一直更新到 1996 年 6 月为止。但是最早的博客是 Userland 公司 CEO Dave Winer,在 1997 年开始运作的 Scripting News 开始真正具备了博 客的基本重要特性。并且他将这些功能集成到免费软件“Frontier 脚本环境” 。不过,这 个

14、算不算是真正的最早博客,争议颇多。有人认为,从形式上说,是 Jorn Barger 于 1997 年底建立了今天博客网站的基本模样(当时的原始模样可以上网看到。网管人员使用 log(log files)来指称“系统记录文件” ,因此几年前如果用 google 来查 weblog,查出 来大多都是例如 Seacloak 这种网站流量分析软件,而不像今天真正的 weblog。 1.1.2 博客的现状 博客(Blog)在中国的发展历程始于 1998 年,但到了 2000 年才开始真正流行。而 2000 年博客开始进入中国,并迅速发展,但都业绩平平。直到 2004 年木子美事件,才让 中国民众了解到了

15、博客,并运用博客。2005 年,国内各门户网站,如新浪、搜狐,原不看 好博客业务,也加入博客阵营,开始进入博客春秋战国时代。起初,Bloggers 将其每天浏 览网站的心得和意见记录下来,并予以公开,来给其他人参考和遵循。但随着 Blogging 快 速扩张,它的目的与最初已相去甚远。目前网络上数以千计的 Bloggers 发表和张贴 Blog 的目的有很大的差异。不过,由于沟通方式比电子邮件、讨论群组更简单和容易,Blog 已 成为家庭、公司、部门和团队之间越来越盛行的沟通工具,因为它也逐渐被应用在企业内 部网络(Intranet) 。 2 2 系统设计与实现系统设计与实现 2.12.1 需

16、求分析需求分析 2.1.1 功能需求 一般博客的功能包括: 1) 所有人能浏览博客的内容(文章、相片、视频等) ; 2) 所有人可以留言,留言可以是针对文章的评论,也可以是给博主的留言; 3) 博主可以登录,他人无法登录; 4) 博主登录后可以发表、删除、更新文章、相片、视频等内容。他人无法对博客 内容操作; 5) 博主可以对所有人的留言进行管理(删除)操作,也可以回复留言者。 2.1.2 项目计划安排 项目整体的开发计划如图2-1,此图是用Visio 2007生成的,主要描述了项目的整体的 安排和各个部分在整个项目开发周期中所占的时间比重。 图 2-1 项目安排计划 2.22.2 系统开发环

17、境系统开发环境 2.2.1 开发环境简介 硬件配置: 机器:Thinkpad CPU: Core 2 T5670 1.8GHz 内存:DDR2 3G 硬盘:160G 操作系统:Microsoft Windows Server 2008 Datacenter 64bit (en-us) 开发工具:Visual Studio 2008 Team System、SQL Server 2005 Express 工具插件:Silverlight、jQuery 2.2.2 Visual Studio 2008 开发环境简介 Visual Studio 2008是微软公司推出目前最流行的Windows平台应

18、用程序开发环境。 Visual Studio 2008 在三个方面为开发人员提供了关键改进:快速的应用程序开发、高效 的团队协作和突破性的用户体验。Visual Studio 2008可以用来创建 Windows 平台下的 Windows 应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和 Office 插件。 2.2.3 SQL Server 2005 数据库简介 SQL Server 2005 是一个全面的数据库平台,使用集成的商业智能 (BI) 工具提供了 企业级的数据管理。SQL Server 2005 数据库引擎为关系型数据和结构化数据提供了更安 全可靠的存储功能,可

19、以构建和管理用于业务的高可用和高性能的数据应用程序。 SQL Server 2005已经与Visual Studio 和.NET Framework进行了集成。据微软官方显 示,利用SQL Server 2005 和 Visual Studio进行开发,开发速度提高了40以上,在很 多场景中,能减少5070代码量。 考虑到 SQL Server 2005 与.NET 平台的集成性和便利性,同时也考虑到技术之间的衔 接、系统的性能和运行的稳定性,所以本系统使用的是 SQL Server 2005 Express 数据库。 2.2.3 3 相关技术简介相关技术简介 2.3.1 C#语言简介 C#语

20、言是一门简单、现代、优雅、面向对象、类型安全、平台独立的一门新型组件编 程语言。经过编译,C#编写的源代码被编译为一种符合 CLI 规范的中间语言(IL) ,通常是 具有扩展名为.exe 和.dll 的文件。运行时,由 CLR 加载 IL 元数据和引用的资源,然后转 换成机器语言再执行。本系统采用 C#语言来开发各个组件、功能模块。 2.3.2 ASP.NET 简介 ASP.NET 是一个统一的 Web 开发模型,作为 .NET Framework 的一部分提供。当在编 写 ASP.NET 应用程序的代码时,可以访问.NET Framework 中的类。 ASP.NET 中有一个重要功能,可以

21、通过与客户端应用程序中类似的、基于事件的模型 来对网页进行编程。与传统 HTML 页或基于客户端的 Web 应用程序中的事件相比,由 ASP.NET 服务器控件引发的事件的工作方式稍有不同。导致差异的主要原因在于事件本身 与处理该事件的位置的分离。在基于客户端的应用程序中,在客户端引发和处理事件。但 是,在 ASP.NET 网页中,与服务器控件关联的事件在客户端(浏览器)上引发,但由 ASP.NET 页在 Web 服务器上处理。 对于在客户端引发的事件,ASP.NET Web 控件事件模型要求在客户端捕获事件信息, 并通过 HTTP POST 将事件消息传输到服务器。页必须解释该 POST 以

22、确定所发生的事件, 然后在要处理该事件的服务器上调用代码中的相应方法。 本系统中在 UI 层的表示层逻辑就是基于 ASP.NET 的 Web 事件模型进行编程的。利用这 种编程模型既可以简化 Web 应用程序的开发又可以实现出功能非常强大系统。 2.3.3 ADO.NET 简介 Microsoft 在开始设计.NET 框架时设计了一个新的数据访问框架 ADO.NET。ADO.NET 具有如下优点:提供了断开的数据访问模型;提供了与 XML 的紧密集成;提供了与 .NET 框架的无缝集成(例如,兼容基类库类型系统) 。 ADO.NET 提供两种访问模式:断开连接模式和连接模式。使用断开连接模式一

23、般利用 DataAdapter 从数据源检索数据并填充 DataSet 中的表,同时还可将对 DataSet 所做的 更改解析回数据源。而使用连接模式是利用 ADO.NET DataReader 从数据库中检索只读、 只进的数据流。查询结果在查询执行时返回,在并存储在客户端的网络缓冲区中,直到程 序使用 DataReader 的 Read 方法对它们发出请求。使用 DataReader 可以提高应用程序 的性能,原因是它只要数据可用就立即检索数据,并且(默认情况下)一次只在内存中存 储一行,减少了系统开销。 创建一个 DataSet 对象的系统开销是比较大的。如果大范围的使用 DataSet,

24、对系统 的压力会增大很多。DataSet 本身是弱类型的,在业务逻辑处理层进行操作时会存在类型 安全的隐患,并且在编码时也不能提供代码提示的便捷性。虽然可以构建强类型的 DataSet,但是会增加大量的代码。另外如果深度使用 DataSet,比如用到 DataRelation 等,又会牵扯到与数据库的同步问题,及数据库关于加锁机制的问题。这样会增大技术复 杂度,这是没有必要的。在本系统中使用是连接方式来读取数据,同时使用泛型 List 来承 载数据,每读一条数据就存储到泛型 List 中去,泛型 List 相对于弱类型的 DataSet 省去 了不必要的装箱和拆箱操作,大大提高了性能。 2.3

25、.4 Silverlight 技术简介 Microsoft Silverlight 是一种跨浏览器、跨平台的用于为 Web 生成和提供下一代媒 体体验和丰富的交互式应用程序 (RIA)。Silverlight 统一了服务器、Web 和桌面的功能, 统一了托管代码和动态语言、声明性编程和传统编程以及 Windows Presentation Foundation (WPF) 的功能。可以采用 C# 和 VB.NET 编程语言来编写托管代码,并可以全 面使用.NET 框架库。技术细节请参见 Silverlight SDK 或者 MSDN 等资料,本系统涉及到 的详细代码请参见 3.2.8 节。 由

26、于在开发上有.NET 强大类库的支撑,同时在 IDE 上又有 Visual Studio 2008、Blend2 这样的工具,与服务器通信又有 WCF 这样的技术做铺垫。所以本人选择 Silverlight 作为这个毕业设计的前端展示技术。 2.3.5 WCF 简介 Windows 通信基础(Windows Communication Foundation,WCF)是微软分布式应用程 序开发的集大成者,它整合了.Net 平台下所有的和分布式系统有关的技术,例如.Net Remoting、ASMX、WSE 和 MSMQ。以通信(Communiation)范围而论,它可以跨进程、跨机器、 跨子网、

27、企业网乃至于 Internet;以宿主程序而论,可以以 ASP.NET,EXE,WPF,Windows Forms,NT Service,COM+作为宿主(Host)。WCF 可以支持 的协议包括 TCP,HTTP,跨进程以及自定义,安全模式则包括 SAML, Kerberos,X509,用 户/密码,自定义等多种标准与模式。也就是说,在 WCF 框架下,开发基于 SOA 的分布式系 统将变得非常容易。 本系统也涉及部分 WCF 技术,主要用在 Silverlight 与后台数据的交互上。 Silverlight 仅仅支持的一种绑定,那就是 BasicHttpBinding 协议,而这正是 W

28、CF 所支持 的一种基本协议。这样 WCF 与 Silverlight 两种技术之间有了更好的衔接,同时这给我在 系统的开发中提供了很好的便利性。 详细的代码请参见源码部分。 2.3.6 jQuery 库简介 jQuery 由美国人 John Resig 创建。jQuery 是继 prototype 之后又一个优秀的 JavaScript 框架。它是轻量级的 js 库(压缩后只有 21k),这是其它的 JavaScript 库所不 及的,它兼容 CSS3,还兼容各种浏览器。jQuery 是一个快速的,简洁的 JavaScript 库, 使用户能更方便地处理 HTML documents、eve

29、nts、实现动画效果,并且方便地为网站提供 AJAX 交互。 jquery 的简单的实用的确有相当大的吸引力。本系统在 UI 层就应用了 jQuery 库,用 来展现一些界面特效。详细的代码请参见源码部分。 2.42.4 系统设计系统设计与实现与实现 2.4.1 分层架构核心思想 1、针对接口编程,而不针对实现编程 针对接口编程,而不是针对实现编程-这是面向对象设计中最重要的原则之一这里所 指的接口,不是特指编程语言中的具体语言元素(如 C#中由 Interface 定义的语言接口) , 而是只一种抽象的,在语义层面上起着接合作用语义体。它的具体实现,可能是接口,可 能是抽象类,甚至可能是具体

30、类。一般接口可以理解为以下两点: 接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则。体 现了自然界“如果你是则必须能”的理念。 接口是在一定粒度视图上同类事物的抽象表示。 具体到 N 层架构中,针对接口编程的意义是这样的:现约定将 N 层架构的各层依次编 号为 1、2、K、N-1、N,其中层的编号越大,则越处在上层,那么第 K 层不应该 依赖具体一个 K-1 层,而应该依赖一个 K-1 层的接口,即在第 K 层中不应该有 K-1 层 中的某个具体类。 2、依赖倒置原则 在软件设计原则中,有一种重要的思想叫做依赖倒置。它的核心思想是:不能让高层 组件依赖底层组件,而且,不管高

31、层组件和底层组件,两者都应依赖于抽象。所谓的依赖 倒置原则,其实就是上面提到针对接口编程,而不是针对实现编程,两者在本质上是统一 的。 综上所述,本系统应该是这样一种架构: 1) N 层架构的各层依次编号为 1、2、K、N-1、N,其中层的编号越大, 则越处在上层。 2) 架构中仅存在一种依赖,即第 K 层接口依赖第 K-1 层,其中 1K=N。 3、封装变化 封装变化的原则定义为:找出应用中可能需要变化之处,把它们独立出来,不要和那 些不需要变化的代码混杂在一起。 4、开放、关闭原则 开发-关闭原则定义为:对扩展开放,对修改关闭。 5、单一职责原则 任何一个类都应该有单一的职责,属于单独的一

32、层,而不能同时担负两种职责或属于 多各层。 三层架构是一种比较成熟的系统架构,通过将整个系统分为不同的逻辑块,大大降低 了应用系统开发和维护的成本。三层架构将数据访问和逻辑操作都集中到组件中,增强了系 统的复用性。同时也使系统的扩展性大大增强。模块化使得系统很容易在纵向和水平两个 方向拓展:一方面可以将系统升级为更大、更有力的平台,另一方面也可以适当增加规模 来增强系统的网络应用。 从开发角度和应用角度来看,三层架构比双层或单层结构都有更大的优势。三层结构 适合群体开发,每人可以有不同的分工,协同工作使效率倍增。开发双层或单层应用时, 每个开发人员都应对系统有较深的理解,能力要求很高,开发三层

33、应用时,则可以结合多 方面的人才,只需少数人对系统全面了解,从一定程度工降低了开发的难度。 基于以上优点本系统采用三层架构来开发。 2.4.2 实体介绍 根据对本博客系统的简要需求分析,可以确定以下几个实体: 用户信息:代表用户,包括了用户的登录名、密码、个性设置等。 博客留言:代表一些人对博客的评价等信息。 博客信息:包含了博客的基本信息,如博客名称、访问人数、主题等。 文章:就是文章实体,包含文章的基本信息,如标题、内容、发布时间等。 文章分类:就是文章的类别。 文章评论:代表了对于莫一篇文章发表的评论。 照片:代表照片基本信息。 照片分类:代表照片的分类。 2.4.3 数据库设计 图 2

34、-2 数据库表 整个系统涉及的数据库的表有 8 张,各个表之间的关系如图 2-2。以下是各个表的简 要说明: UserInfo:用户表。主要保存了博主的相关信息。 Leavewords:留言表。主要保存访问者对整个 Blog 的评论。 BlogInfo:博客表。主要存放 Blog 的基本设置信息。 PhotoCategory:图片分类表。主要存放图片的分类信息。 Photo:图片表。主要存放图片信息。 PostCategory:文章分类表。文章分类信息。 Post:文章表。文章的基本信息。 Comment: 文章评论表。文章的相关评论信息。 图 2-3 完整显示了整个系统设计到的表。 图 2-

35、3 数据库表 存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单 元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许声明变量、 有条件执行以及其它强大的编程功能。存储过程在创建时即在服务器上进行编译,所以执 行起来比单个 SQL 语句快。由于存储过程在性能上和功能上相对于单个 SQL 语句有较大的 优势,所以在系统中采用存储过程。图 2-4 展示了系统所用到的存储过程。 图2-4 存储过程 2.4.4 实体类的设计与实现 实体类是对实体的封装,它通常包括私有变量及对应的 get、set 方法,而在 C#语言 中,将 get、set 方法又组合成

36、属性。这些私有变量或者属性,则对应现实实体相应的属 性。实体类的作用主要有两个,一是作为现实实体的计算机代表,二是数据的传递。在分 层架构的应用中,数据正是封装在实体类中,然后以实体类为载体在各个层次间传递。这 样不但符合面向对象设计的原则,也便于对数据存取进行控制。理想情况下,实体类中不 能含有任何逻辑,它应该单纯是数据的封装。所以,它不应该有方法,当然构造函数除外。 基于以上分析,我们设计的实体类,应该是准确、干净、易用。准确表明实体类应该准确 无误地表示现实中的实体,干净表示实体类应该仅包含数据的封装而不掺杂任何逻辑或者 与数据封装无关的东西,易用表示实体类应该很容易地用来在各层之间传递

37、数据。 本系统不需考虑特殊实体类的情况,仅需编写简单的实体类即可。详细信息请参见相 关代码。完整的类库如图2-5所示。 图2-5 实体类库 2.4.5 接口设计 接口有以下几个作用: 接口明确了各层次的职责。 接口决定了各个层次具体需要实现的功能。 接口形成了整个分层架构的骨架。 接口暴露了层次的 API,为上层提供了依赖点。 因此,接口的设计实际上处在现实需求和程序实现之间,起到承上启下的用。它决定 了需求分析中的各个需求如何合理地映射成各个层次的不同方法。所以接口的设计应该在 需求分析的基础上进行。 本系统中主要需要设计的接口有:数据访问层接口、业务逻辑层接口。 1、数据访问层接口 数据访

38、问层负责与数据源的交互,负责数据的创建、删除、更新及查询工作。它不应 该包含任何业务逻辑或可视性元素,对它所处理数据的业务意义是“无知”的。它与数据 库系统一起负责数据完整性。在三层模型中,数据访问层为上层(业务逻辑层)提供了服 务,数据访问层的接口规定了数据访问层的功能,业务逻辑层针对接口进行编程,不管数 据访问层如何变化,只要接口不变,业务逻辑层都不需要变动。这样在开发系统中将可变 因素减少到最少,这也就是分层架构的最基本的思想:针对接口编程,而不针对实现编程。 以下列出本系统中完整的类库,如图2-6所示。 图2-6 数据访问层接口 2、业务逻辑层接口 在设计业务逻辑层接口之前,需要对业务

39、逻辑层的职责进行明确。业务逻辑层的职责 叙述如下:业务逻辑层负责完成与系统领域相关的业务逻辑操作,实现过程中的数据访问 操作通过调用数据访问层实现。它对业务相关的数据有效性负责,但是不负责 UI 输入数 据的有效性。业务逻辑层中不能含有与显示相关的逻辑,不能决定或影响数据最终的呈现 样式。 由于不同领域的业务逻辑差别很大,所以无法像数据访问层那样对接口操作做出明 确的分类。在实际项目开发中,业务逻辑层接口的设计往往要和领域专家合作。而在本博 客系统中,由于业务逻辑都是比较简单的,所以不用进行专门的领域逻辑调研。完整的类 库如图2-7所示。 图2-7 业务逻辑层接口 2.4.6 IoC 容器及依

40、赖注入机制的设计 1、IoC 容器及依赖注入机制的设计 依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个 概念。具体含义是:当某个角色(调用者)需要另一个角色(被调用者)的协助时,在传 统的程序设计过程中,通常由调用者来创建被调用者的实例。但在具有依赖注入的系统里, 创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者实例的工作 通常由 Ioc 容器来完成,然后注入调用者,因此也称为依赖注入。 具体到分层架构中, 依赖注入可以这样理解:当上层类的需要调用下层类功能时,不再是由上层类直接实例化 下层类,而是通过 I

41、oC 容器获取一个下层类的实例,然后注入到上层类中。 IoC 容器负责根据配置信息,创建不同的数据访问层及业务逻辑层实例,并将其注入 到业务逻辑层与表示层中,从而实现三个层次的解耦。 依赖注入机制的实现有两种途径,一种是使用现有的框架。如 J2EE 平台上的 Spring 框架就可以很好的完成依赖注入功能,在.NET 平台上有 Spring.NET 等框架可以选择。另 一种途径,就是自己编写相应的代码,完成依赖注入机制。 鉴于.NET 平台上的“反射”机制对依赖注入的实现非常方便,所以本系统将采用第二 种方案,使用 Abstract Factory 设计模式和反射机制完成依赖注入的设计。 2、

42、Abstract Factory 模式的应用 Abstract Factory 模式是在依赖注入机制中广泛采用的设计模式, Spring 的 IoC 容 器就采用了这个经典模式。它的中文译名叫做“抽象工厂” ,其定义是这样的:提供一个接 口,用于创建相关或依赖对象的家族,而不需要指定具体类。 以数据访问层注入到业务逻辑层为例(业务逻辑层注入到表示层的原理类似) ,先假 设该博客系统中仅有用户和文章两个实体,并且我们的系统需要能访问 SQLServer 和 Oracle 两个数据库,那么,系统中就需要 SQLServerDAL 和 OracleDAL 两个数据访问层, 它们都含有两个数据访问类,

43、分别是 SQLServerUserDAL、SQLServerPostDAL 和 OracleUserDAL、OraclePostDAL。此时,用户和帖子的业务逻辑层类 UserBLL 与 PostBLL 作为客户类,不应该与具体的数据访问层类耦合,而应该先定义接口 IUserDAL 与 IPostDAL 接口,让业务逻辑层与这两个接口耦合。再设计 SQLServerDALFactory 与 OracleDALFactory,分别作为生成两种数据访问层的工厂,最后通过配置信息,决定在业 务逻辑层中实例化哪个工厂。如图 2-8 所示。 图 2-8 Ioc 容器注入原理 Abstract Facto

44、ry 模式虽然可以完成依赖注入的机制的设计,但是其本身也有缺陷。 从上文可以看出,就数据访问层而言,每个数据访问层实现都要对应一个工厂,业务逻辑 层当然也是如此。并且以后每当添加一个新的实现,都要写一个相应的工厂。因此,当层 次的实现过多时,整个系统就会存在很多工厂,这些工厂不仅使代码变得臃肿,也难以维 护。 .NET 平台上,有一种叫“反射”的机制,利用这种机制,可以简化 Abstract Factory 设计模式的代码。而利用反射机制简化后的 Abstract Factory 则可以叫做 Reflection Abstract Factory,也叫反射工厂。 反射就是动态发现类型信息的能力

45、。它帮助程序设计人员在程序运行时利用一些信息 去动态地使用类型,这些信息在设计时是未知的,这种能力可以用于后期绑定。反射还支 持的更高级的行为,能在运行时动态创建新类型,并且对这些新类型的操作进行调用。 有了反射机制,我们就可以从配置文件(一般是在 Web.config)读出配置信息后,不 是根据这个信息实例化相应的工厂,而是让反射工厂通过这些信息,动态加载相应程序集 中的类,这样每个层次只需要一个工厂就可以完成依赖注入,即使以后出现新的实现,也 不需要修改或添加工厂,只要在配置文件中写明程序集的名字即可。如果考虑到性能和易 用性,可以配合缓存机制和 Facade 设计模式进一步优化 IoC

46、的设计。最终反射工厂结构 图如图 2-9 所示。 图2-9 反射工厂结构图 图 2-10 反射工厂示意图 在图2-10中DALFactory 和 BLLFactory 的实例化箭头直接指向了 IDAL 和IBLL。实际 上,IDAL 和 IBLL 分别是一个工程,它里面是一组接口,这里不是指工厂直接实例化接口 (实际上接口也是不可能被实例化的) 。 使用反射机制后,同一层次的不同实现分别放在不同工程下,而里面包含的各个类的 名字是一致的。例如 SQLServerDAL 下和 OracleDAL 下都有UserInfoDAL,至于运行时具 体实例化哪个,是通过 Web.config 中配置实现的

47、。也就是说Web.config 决定了实例化哪 个工程下的UserInfoDAL。 2.4.7 数据访问层的实现 数据访问层的实现一般有两种方式:基于朴素的实现和基于 ORM 框架的实现。对于 ORM 由于篇幅原因不做过多描述。本系统采用数据访问层的朴素实现,就是指传统的通过 执行 SQL 语句或调用存储过程实现对数据库的操作。.NET 平台内置了丰富的对数据库进 行操作的类库,因此数据访问层的朴素实现非常方便。 具体到本课题中,数据访问层的朴素实现操作一般分为以下两种方式。 使用动态 SQL 语句: 1. 获取参数。 2. 动态组合 SQL 语句。 3. 执行 SQL 语句。 4. 返回结果

48、。 使用存储过程: 1. 获取参数。 2. 生成存储过程可用参数形式。 3. 调用存储过程。 5. 返回结果。 存储过程相对于动态 SQL 语句有一定的优越性。在本系统中都将采用存储过程。在 系统中由于每次执行存储过程时,都需要一系列类似的操作,因此我在系统中对这个模块 进行了一次封装,这样可以大大减少重复性代码。在本系统的实现中,将各种封装对数据 库操作的辅助类叫做 DALHelper 类,如对 SQLServer 数据库进行操作的辅助类就叫做 SQLServerHelper,它包含了四个方法: ExecuteSQLNonQurey、ExecuteSQLReader、ExecuteProce

49、dureNonQurey、ExecuteProcedur eReader,分别用于执行存储过程返回不同的结果。这样,在 SQLServer 数据访问层中, 就可以直接调用这些方法完成操作。朴素实现的示意图如图 2-11 所示。 图 2-11 数据库访问层的朴素实现 本系统的数据访问模块工程如图 2-12 所示。 图 2-12 数据访问模块 1. DAL:类库。实现 IDAL 接口,主要包含各个实体所具有的操作。文件列表如图 2- 11。 2. Factory:类库。产生 DAL 或者 BLL 的实现。 代码分析一:(CacheAccess.cs) /* * Create Time: 2008-

50、12-25 * Editor: Zhou Hui */ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web.Caching; using System.Web; namespace BlogSys.NLBlog.Data.Factory / / Control the cache class. / public sealed class CacheAccess / / Get object from cache / / Cache key /

51、 The object get from cache public static object GetFromCache(string key) Cache cache = HttpRuntime.Cache; return cachekey; / / Save the object value to the cache / / Cache key / The object value / Cache dependency public static void SaveToCache(string key, object value, CacheDependency cacheDependen

52、cy) Cache cache = HttpRuntime.Cache; cache.Insert(key, value, cacheDependency); 这个类主要包含两个方法,GetFromCache和SaveToCache。顾名思义就是一个从缓存里 取,一个是把对象往缓存里加。 从缓存里取的时候可能是返回的NULL,表示这个对象之前并没有被缓存,这个值在 DependencyProvider.cs里面有判断。另一个方法是把一个对象往缓存里面加,注意最后一 个参数是一个缓存依赖,这个参数是指如果这个依赖的文件(或者其他什么)一旦变化了, 那么缓存里的东西就会销毁。 代码分析二:(Dep

53、endencyProvider.cs) /* * Create Time: 2008-12-25 * Editor: Zhou Hui */ using System.Web.Caching; using System.Web; using System.Configuration; using System.Reflection; namespace BlogSys.NLBlog.Data.Factory / / Dependency injected provider / Using reflection mechanism / public sealed class Dependency

54、Provider / / Get DAL object method. / / The name of the DAL class / The object value public static object GetDALObject(string className) /Get DAL namespace from cache object dalObject = CacheAccess.GetFromCache(DAL); if (dalObject = null) /DAL namespace doesnt exist in the cache, /then insert new one into the cache CacheDependency fileDependency = new CacheDepende

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论