Nhibernate测试驱动开发

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Nhibernate测试驱动开发本文约定:1.Nhibernate简写为NHB;2.本文例子的开发平台为win2000xp+sp2,sqlserver2000,Nhibernate0.9.1.0;3.使用SQLServer自带的罗斯文商贸数据库(Northwind),中文版;4.本文例子是基于测试驱动开发(TDD)的,因此建议使用NUnit2.2和Log4Net(如果你不熟悉NUnit,不要紧啊,趁此机会学习点简单的应用);一NHB简介NHB是基于ms.net的O/RMapping持久框架,它从基于Java的Hibernate项目移植而来。O/RMapping就是把对象到映射关系数据库的记录,简单的说就是能实现把一个对象存储为数据表中的一条记录和由一条记录创建一个相应的对象,数据表中的数据就是对象的属性。那么为什么要使用O/RMapping?它与传统的DataSet/DataTable又有什么不同了?首先是设计上的不同,当使用O/RMapping时,更多的是从对象的角度来设计程序,而把数据(对象的属性)存储的细节放在后面,可以完全采用面向对象(OO)的方式来设计,而在使用DataSet/DataTable时,它只是存放数据的对象,看起来更像一个数据表,不能直观的表达业务概念。二NHB中主要接口的介绍ISessionISession是面向用户的主要接口,主要用于对象持久化,数据加载等操作,支持数据库事务,它隐藏了NHB内部复杂的实现细节,ISession由ISessionFactory创建。ISessionFactoryISessionFactory是NHB内部的核心类,它维护到持久机制(数据库)的连接并对它们进行管理,同时还会保存所有持久对象的映射信息。ISessionFactory由Configuration创建,因为创建ISessionFactory的开销非常大(需要加载映射信息),所以这个对象一般使用Singleton(单例)模式。ITransactionITransaction是NHB的事务处理接口,它只是简单的封装了底层的数据库事务。事务必须由ISession来启动。ICriteriaICriteria是Expression(表达式)数据加载接口,Expression是一个关系表达式组合,通过它能产生SQL语句的Where部分,用户需要通过ISession来间接调用它。IQueryIQuery是HQL数据加载接口,HQL(HibernateQueryLanguage)是NHB专用的面向对象的数据查询语言,它与数据库的SQL有些类似,但功能更强大!同ICriteria一样,也需要通过ISession来间接调用它。三持久化操作1.会话和会话工厂要进行持久化操作,必须先取得ISession和ISessionFactory,我们用一个Sessions类来封装它们,Sessions类的属性和方法都是静态的,它有一个Factory属性,用于返回ISessionFactory,有一个GetSession方法,用于取得一个新的ISession。测试类代码如下:style=BORDER-RIGHT:black1pxsolid;PADDING-RIGHT:4px;BORDER-TOP:black1pxsolid;PADDING-LEFT:4px;PADDING-BOTTOM:4px;BORDER-LEFT:black1pxsolid;PADDING-TOP:4px;BORDER-BOTTOM:black1pxsolid;BACKGROUND-COLOR:#edededusingSystem;usingNUnit.Framework;usingNHibernate;namespaceNHibernateTest{//////SessionsFixture的摘要说明。//////[TestFixture]publicclassSessionsFixture{publicSessionsFixture(){////TODO:在此处添加构造函数逻辑//}[Test]//测试能否取得NHB会话工厂。publicvoidFactoryTest(){ISessionFactorysf=Sessions.Factory;Assert.IsNotNull(sf,getsessionfactoryfail!);}[Test]//测试能否取得NHB会话。publicvoidGetSessionTest(){ISessions=Sessions.GetSession();Assert.IsNotNull(s,getsessionfail!);}}}现在还没写Sessions类,将不能通过编译!下面我们来实现Sessions类.style=BORDER-RIGHT:black1pxsolid;PADDING-RIGHT:4px;BORDER-TOP:black1pxsolid;PADDING-LEFT:4px;PADDING-BOTTOM:4px;BORDER-LEFT:black1pxsolid;PADDING-TOP:4px;BORDER-BOTTOM:black1pxsolid;BACKGROUND-COLOR:#edededusingSystem;usingNHibernate;usingSystem.Reflection;namespaceNHibernateTest{//////Sessions的摘要说明。///publicclassSessions{privatestaticreadonlyobjectlockObj=newobject();privatestaticISessionFactory_factory;publicSessions(){////TODO:在此处添加构造函数逻辑//}publicstaticISessionFactoryFactory{get{if(_factory==null){lock(lockObj){if(_factory==null){NHibernate.Cfg.Configurationcfg=newNHibernate.Cfg.Configuration();cfg.AddAssembly(Assembly.GetExecutingAssembly());_factory=cfg.BuildSessionFactory();}}}return_factory;}}publicstaticISessionGetSession(){returnFactory.OpenSession();}}}OK,现在编译可以通过了,启动NUnit并选择生成的文件NHibernateTest.exe,运行测试。我们得到了红色的条,出错了!原来还没有加入NHibernate的配置信息(当使用NHibernate时,需要在项目的配置文件中加入NHibernate的配置信息。关于配置信息,在下面有说明)。在项目的配置文件App.Config(如没有请自行创建一个)中加入以下内容.稍做解释,下面的配置文件主要是配置了NHibernate和log4net,例如配置了NHibernate连接数据库的连接字符串;log4net把日志记到哪个文件中,本例就是log.txt。每次写日志向文件中追加,而不是重写style=BORDER-RIGHT:black1pxsolid;PADDING-RIGHT:4px;BORDER-TOP:black1pxsolid;PADDING-LEFT:4px;PADDING-BOTTOM:4px;BORDER-LEFT:black1pxsolid;PADDING-TOP:4px;BORDER-BOTTOM:black1pxsolid;BACKGROUND-COLOR:#edededxmlversion=1.0encoding=utf-8?configurationconfigSectionssectionname=nhibernatetype=System.Configuration.NameValueSectionHandler,System,Version=1.0.5000.0,Culture=neutral,PublicKeyToken=b77a5c561934e089/sectionname=log4nettype=log4net.Config.Log4NetConfigurationSectionHandler,log4net/configSectionsnhibernateaddkey=hibernate.show_sqlvalue=true/addkey=hibernate.connection.providervalue=NHibernate.Connection.DriverConnectionProvider/addkey=hibernate.dialectvalue=NHibernate.Dialect.MsSql2000Dialect/addkey=hibernate.connection.driver_classvalue=NHibernate.Driver.SqlClientDriver/addkey=hibernate.connection.connection_stringvalue=Server=127.0.0.1;initialcatalog=Northwind;Userid=golinjoe;Password=2525775/nhibernatelog4netappendername=rollingFiletype=log4net.Appender.RollingFileAppender,log4netparamname=Filevalue=log.txt/paramname=AppendToFilevalue=true/paramname=RollingStylevalue=Date/paramname=DatePatternvalue=yyyy.MM.dd/paramname=StaticLogFileNamevalue=true/layouttype=log4net.Layout.PatternLayout,log4netparamname=ConversionPatternvalue=%d[%t]%-5p%c[%x]%X{auth}-%m%n/layoutappenderrootpriorityvalue=ALL/appender-refref=rollingFile/rootlog4netconfiguration再次运行测试,就可以看见绿色的条了。在取得会话工厂的代码中,我使用了如下代码:if(_factory==null){lock(lockObj){if(_factory==null){//buildsessionfactorycode;}}}这是一个典型的doublelock方式,用来产生线程安全的Singletion(单例)对象。2.基本CRUD操作在很多介绍NHB的文章,包括NHB带的测试用例中,业务对象只是做为一个数据实体存在的,它没有任何操作!这在java中是比较典型的作法。而我希望我们的业务对象自身就能完成基本的Create/Retrieve/Update/Delete,即CRUD操作,在罗斯文商贸应用中,存在客户(customer)业务对象,先来为它建立一个测试用例,style=BORDER-RIGHT:black1pxsolid;PADDING-RIGHT:4px;BORDER-TOP:black1pxsolid;PADDING-LEFT:4px;PADDING-BOTTOM:4px;BORDER-LEFT:black1pxsolid;PADDING-TOP:4px;BORDER-BOTTOM:black1pxsolid

1 / 69
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功