三层的例子.docx
- 文档编号:9182510
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:24
- 大小:212.25KB
三层的例子.docx
《三层的例子.docx》由会员分享,可在线阅读,更多相关《三层的例子.docx(24页珍藏版)》请在冰点文库上搜索。
三层的例子
谈企业软件架构:
第一章简单的开始
本章我们从一个简单的项目开始,一个基于NHibernate2.1数据库O/RMapping工具的简单编程实例,来说明即使我们使用了O/RMapping工具仍然有可能会把程序写成没有层次结构和杂乱无章。
不是说这样的看上去简单的结构不是好结构,正如很多程序员说的一样,能解决问题的结构就是好的结构。
问题的关键是怎么解决问题的?
项目有多大、业务领域有多复杂、项目团队有多少人等等这些因素都会决定着软件架构本身。
作为编写围绕企业应用的行业软件,项目的成功的关键是我们在规定的时间、预算范围内,交付能够满足用户需求的软件产品。
只是在项目的前期多考虑一下项目的维护问题、升级问题和项目在下一个项目的重用性问题等等,一开始就着手一个简单和“好”的框架会在某些时候带来意想不到的收获,同时为了这个收获并没有付出太多额外的工作,只是你的团队成员和你一起知道如何运用这些技术——领域模型(DomainModel)。
让我们一步一步的来,先从简单的开始。
这里先说明例子所使用的开发环境:
开发工具:
MicrosoftVisualStudio2008Version9.0.21022.8RTM
Microsoft.NETFrameworkVersion3.5SP1
MicrosoftVisualStudio2008Version9.0.21022.8RTM
Microsoft.NETFrameworkVersion3.5SP1
开发语言:
C#
操作系统:
MicrosoftXPprofessionalServicePack2
数据库开发工具:
MicrosoftSQLServer2005ServicePack1
数据映射工具:
NHibernate2.1
配置管理工具:
VisualSourceSafe8.0
单元测试工具:
TestDriven.NET-2.21.2448_Personal支持NUnit-2.5
1.1 建立数据库表
假定我们有一张关于Customer的数据库表,我的“简单的开始”就是从如何实现这个表的基本业务逻辑开始。
下面实现创建表的脚本:
注意USE[Data]请使用你自己的数据库名称
USE[Data]
GO
/******对象:
Table[dbo].[Customer] 脚本日期:
05/31/200921:
50:
49******/
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
SETANSI_PADDINGON
GO
CREATETABLE[dbo].[Customer](
[CustomerId][int]NOTNULL,
[Firstname][varchar](50)COLLATEChinese_PRC_CI_ASNULL,
[Lastname][varchar](50)COLLATEChinese_PRC_CI_ASNULL,
[Gender][varchar]
(2)COLLATEChinese_PRC_CI_ASNULL,
[Address][varchar](50)COLLATEChinese_PRC_CI_ASNULL,
[Remark][varchar](100)COLLATEChinese_PRC_CI_ASNULL,
CONSTRAINT[PK_Customer]PRIMARYKEYCLUSTERED
(
[CustomerId]ASC
)WITH(IGNORE_DUP_KEY=OFF)ON[PRIMARY]
)ON[PRIMARY]
GO
SETANSI_PADDINGOFF
1.2 创建ASP.NETWebApplication项目
在VS2008中创建ASP.NETWebApplication项目命名为DemoWebApp,把Default.aspx更名为customer.aspx如图所示:
本DEMO程序我们使用NHibernate2.2为映射工具,关于NHibernate2.2的使用请参考相关网络资源如:
NHibernate之旅系列文章导航。
1.3 创建NHibernate2.2领域模型映射文件
我添加NHibernate2.2Model文件Customer.cs和它的映射文件Customer.hbm.xml。
Customer.cs代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceDemoWebApp
{
publicclassCustomer
{
publicvirtualintCustomerId{get;set;}
publicvirtualstringFirstname{get;set;}
publicvirtualstringLastname{get;set;}
publicvirtualstringGender{get;set;}
publicvirtualstringAddress{get;set;}
publicvirtualstringRemark{get;set;}
}
}
Customer.hbm.xml代码如下:
xmlversion="1.0"encoding="utf-8"?
>
nhibernate-mapping-2.2"> 这两个文件是实现Model对象与表之间的关系映射所必需的,通过这两个文件我们才能完成对象到数据库表的数据持久化。 1.4 实现Customer模型的增加、查询、修改和删除基本业务 接下来我们实现关于Customer的增加、查询、修改和删除简单的业务操作,基于Web的程序我们是如何完成的这样的功能实现的。 如图,我们在WEB界面上增加操作按钮,然后在按钮的点击事件里实现相应的业务代码。 图片看不清楚? 请点击这里查看原图(大图)。 我们需要给项目添加NHibernate库文件的引用。 这样才能调用NHibernate类库文件提供的API访问,如图: 同时记得在Web.Config配置NHibernate的项目,以确保程序能够使用NHibernate类库。 nhibernate-configuration-2.2"> 然后在Web页面的Page_Load事件里初始化NHibernate的会话,才能根据Session去调用持久层提供的API操作数据。 usingSystem.Linq; usingSystem.Web; usingSystem.Web.Security; usingSystem.Web.UI; usingSystem.Web.UI.HtmlControls; usingSystem.Web.UI.WebControls; usingSystem.Web.UI.WebControls.WebParts; usingSystem.Xml.Linq; usingSystem.Text; usingNHibernate; usingNHibernate.Cfg; usingNHibernate.Criterion; namespaceDemoWebApp { publicpartialclass_Default: System.Web.UI.Page { privateConfiguration_config; privateISessionFactory_factory; privateISession_session; privateCustomer_customer; protectedvoidPage_Load(objectsender,EventArgse) { _config=newConfiguration().AddAssembly("DemoWebApp"); _factory=_config.BuildSessionFactory(); _session=_factory.OpenSession();//获得一个NHibernate当前会话 } 1.4.1创建一个业务对象并持久化到数据库 现在我们来看看如何增加一个客户数据吧。 我们首先创建一个Customer对象,然后把文本框里的值赋给Customer对应的属性,最后向NHibernateSession提交该Customer对象完成Customer对象的数据库提交工作。 同时提交过程中我们启动了Session的事务管理,已确保提交出现异常时事务会回滚等。 protectedvoidbt_Add_Click(objectsender,EventArgse) { _customer=newCustomer(); _customer.Firstname=this.TextBox1.Text.Trim();; _customer.Gender=this.TextBox2.Text.Trim(); _customer.Address=this.TextBox3.Text.Trim(); _customer.CustomerId=1000; ITransactiontran=_session.BeginTransaction(); try { _session.Save(_customer); tran.Commit(); } catch { tran.Rollback(); if(_session.Contains(_customer)) { _session.Evict(_customer); } } this.tb_name.Text=_customer.CustomerId.ToString(); } 1.4.2根据标识查询一个持久化对象protectedvoidButton3_Click(objectsender,EventArgse) { _customer=(Customer)_session.Get(typeof(Customer),Convert.ToInt32(tb_name.Text.Trim())); if(_customer! =null) { this.TextBox1.Text=_customer.Firstname; this.TextBox2.Text=_customer.Gender; this.TextBox3.Text=_customer.Address; this.TextBox5.Text=_customer.Remark; } } 1.4.3修改一个持久化对象 protectedvoidButton1_Click(objectsender,EventArgse) { _customer=_session.Get _customer.Firstname=this.TextBox1.Text.Trim();; _customer.Gender=this.TextBox2.Text.Trim(); _customer.Address=this.TextBox3.Text.Trim(); _customer.Remark=this.TextBox5.Text.Trim(); ITransactiontran=_session.BeginTransaction(); try { _session.SaveOrUpdate(_customer); tran.Commit(); } catch { tran.Rollback(); if(_session.Contains(_customer)) { _session.Evict(_customer); } } } 1.4.4删除一个持久化对象protectedvoidButton2_Click(objectsender,EventArgse) { _customer=(Customer)_session.Get(typeof(Customer),Convert.ToInt32(tb_name.Text.Trim())); ITransactiontran=_session.BeginTransaction(); try { _session.Delete(_customer); tran.Commit(); } catch { tran.Rollback(); if(_session.Contains(_customer)) { _session.Evict(_customer); } } } 1.5 结束语 上例我们可以看出即使使用面向对象的持久化工具,我们面向领域编程,如果没有良好的代码组织和层次结构,我们同样可以写出领域模型与业务逻辑及对象映射都揉杂在界面层的事件中,这样的软件结构在面向简单业务和快速的实现上对于许多程序员来说是容易入手和理解的。 可是当这样的代码需要升级维护以满足趋于复杂的业务时,我们发现系统的多么的脆弱和难于理解。 在我的项目生涯中,听到程序员抱怨最多的就是与其读懂并修改别人的代码还不如自己重新写一个(当然这还与代码缺乏良好的命名习惯、编写组织及注释等等有关)。 于是我们的项目中会不断的重复这样的现象,另一个程序员接受别人的功能模块时,总是打定主意重新开始,但是他往往忽略了当别人维护他的代码时也会发出同样的感叹。 浅谈企业软件架构: 第二章分层架构 本章我们重点来描述如何实现开发中软件层次结构,通过对第一章的例子的重构,以实例的方式展示一个分层结构是何样子,力求简要说明如何考虑软件开发中的分层问题,建立一个关于软件分层一个初步的印象。 在个人以往的项目经历中,遇到了各种各样的软件层次概念,尤其对物理分层与逻辑分层没有清晰的认识,很多开发人员一谈软件分层必然是远程调用、远程服务之类;要不就是过度分层,不管项目和开发环境情况的实际需要,就搞一个三层软件架构,结果呢、层与层之间又没有良好的封装和隔离性,反倒是层与层之间处处是交叉引用,业务逻辑与技术逻辑在层与层之间盘根错节纠缠不清,未能获得分层给项目开发带来的优势的同时,反倒增加了软件开发人员掌握和理解架构的难度、降低了开发效率和系统维护的复杂度。 2.1层次演化 关于系统的层次结构我们最常见的例子是: OSI网络结构的七层模型,它们分别为: 应用层(Application) 表示层(Presentation) 会话层(Session) 传输层(Transport) 网络层(Network) 数据链路层(DataLink) 物理层(Physical) 以及经典的TCP/IP四层模型: 应用层 传输层 网际层 网络接口层 们的分层描述及功能作用,在网上可以搜索到很多,这里就不做详细描述了。 总之,用分层的观点来考虑系统时,就是把分层考虑成“多层蛋糕”的形象,上一层基于下一层来实现,使用了下层定义的各种服务(接口),下一层不知道其上有几层,功能是什么。 下一层对上一层隐藏自己的实现细节,这样上一层只关心下一层提供了什么样的服务(接口)可供调用,具体的实现技术算法就不是它关心的事情了。 每一层专注在自己的功能领域,通过接口方式为上一层提供服务。 分层架构最大的困难就是如何决定建立那些层次以及每一层有哪些相应的职责。 不是盲目的为了分层而分层,这方面TCP/IP的四层模型就是很好的例子,根据自己的需要把七层模型合并成4层模型。 企业应用的层次演化是从最早的没有层次——〉C/S2层结构模式——〉表现层、领域层、数据源层的3层结构模式。 大部分的企业应用是与数据的存储息息相关的,所以企业应用是伴随着关系数据库的发展而一起兴起和广泛应用。 C/S结构模式便成了大家最耳熟能详的企业软件架构。 但是我们在讨论企业应用的层次结构时,一定要记住它包含两个层次意思: 一个是物理链路的分离,客户端是一台计算机,数据库服务则安装在另一台计算机上,通过远程访问的模式实现两个物理节点的数据交流。 同时层次结构还有的另一层含义就是逻辑层次,通过把不同的逻辑封装在不同的软件开发层次
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 三层 例子