Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30479943
  • 博文数量: 708
  • 博客积分: 12163
  • 博客等级: 上将
  • 技术积分: 8240
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-04 20:59
文章分类

全部博文(708)

分类: C/C++

2008-05-29 11:26:53

http://www.springframework.cn/document/2006/Spring.NET&NHibernateOfCSharp.NET.htm

第二章

ORM的全称是Object/Relation Mapping,即对象/关系映射。ORM也可理解是一种规范,具体的ORM框架可作为应用程序和数据库的桥梁。目前ORM的产品非常多,比如Apache组织下的OJBOracleTopLinkJDO等等。

      什么是ORM

ORM并不是一种具体的产品,而是一类框架的总称,它概述了这类框架的基本特征:完成面向对象的程序设计语言到关系数据库的映射。基于ORM框架完成映射后,既可利用面向对象程序设计语言的简单易用性,又可利用关系数据库的技术优势。

面向对象程序设计语言与关系数据库发展不同步时,需要一种中间解决方案,ORM框架就是这样的解决方案。笔者认为,随着面向对象数据库的发展,其理论逐步完善,最终会取代关系数据库。只是这个过程不可一蹴而就,ORM框架在此期间内会蓬勃发展。但随着面向对象数据库的出现,ORM工具会自动消亡。

 

      为什么需要ORM

在上一节已经基本回答了这个问题,面向对象的程序设计语言,代表了目前程序设计语言的主流和趋势,其具备非常多的优势,比如:

n        面向对象的建模、操作。

n        多态、继承。

n        摒弃难以理解的过程。

n        简单易用,易理解性。

 

但数据库的发展并未与程序设计语言同步,而且,关系数据库系统的某些优势,也是面向对象的语言目前无法解决的。比如:

n        大量数据操作查找、排序。

n        集合数据连接操作、映射。

n        数据库访问的并发、事务。

n        数据库的约束、隔离。

面对这种面向对象语言与关系数据库系统并存的局面,采用ORM就变成一种必然。

      流行的ORM框架简介

目前ORM框架的产品非常多,除了各大著名公司、组织的产品外,甚至,其他一些小团队也都有推出自己的ORM框架。目前流行的ORM框架有如下这些产品。

n        大名鼎鼎的(N)Hibernate出自Gavin King的手笔,目前最流行的开源ORM框架,其灵巧的设计,优秀的性能,还有丰富的文档,都是其迅速风靡全球的重要因素。

n        传统的Entity EJBEntity EJB实质上也是一种ORM技术,这是一种备受争议的组件技术,很多人说它非常优秀,也有人说它一钱不值。事实上,EJBJ2EE的蓬勃发展赢得了极高的声誉,就笔者的实际开发经验而言,EJB作为一种重量级、高花费的ORM技术上,具有不可比拟的优势。但由于其必须运行在EJB容器内,而且学习曲线陡峭,开发周期、成本相对较高,因而限制EJB的广泛使用。

n        IBATISApache软件基金组织的子项目。与其称它是一种ORM框架,不如称它是一种 “Sql Mapping”框架。相对Hibernate的完全对象化封装,iBATIS更加灵活,但开发过程中开发人员需要完成的代码量更大,而且需要直接编写SQL语句。

n        OracleTopLink作为一个遵循OTN协议的商业产品,TopLink在开发过程中可以自由下载和使用,但一旦作为商业产品使用,则需要收取费用。可能正是这一点,导致了TopLink的市场占有率。

 

n        OJBApache软件基金组织的子项目。开源的ORM框架,但由于开发文档不是太多,而且OJB的规范一直并不稳定,因此并未在开发者中赢得广泛的支持。

 

第三章 入门

      Spring.NET概览

Spring.NET 是一个关注于.NET企业应用开发的应用程序框架。它能够提供宽广范围的功能,例如依赖注入、面向方面编程(AOP)、数据访问抽象, 以及ASP.NET集成等。基于javaspring框架的核心概念和价值已被应用到.NETSpring.NET 1.0 包含一个完全功能的依赖注入容器和AOP库。后续的发布将包含对ASP.NETRemoting和数据访问的支持。下图展现出了 Spring .NET的各个模块。具有黑色阴影的模块包含在1.0版本中,其他模块计划在将来的发布中推出。在很多情况下,你可以在我们的下载网站中发现可以工作的计划模块的实现。

Spring .NET框架概览

Spring.Core 库是框架的基础, 提供依赖注入功能。Spring.NET中大多数类库依赖或扩展了Spring.Core的功能。IObjectFactory接口提供了一个简单而优雅的工厂模式,移除了对单例和一些服务定位stub写程序的必要。允许你将真正的程序逻辑的配置和依赖的详细情况解耦。作为对IObjectFactory的扩展,IApplicationContext接口也在Spring.Core库中,并且添加了许多企业应用为中心的功能,例如利用资源文件进行文本本地化、事件传播、资源加载等等。

 

Spring.Aop 库提供对业务对象的面向方面编程(AOP) 的支持。Spring.Aop 库是对Spring.Core库的补充,可为声明性地建立企业应用和为业务对象提供服务提供坚实的基础。

 

Spring.Web 库扩展了ASP.NET,添加了一些功能,如对ASP.NET页面的依赖注入,双向数据绑定,针对 ASP.NET 1.1Master pages以及改进的本地化支持。

 

Spring.Services库可让你将任何“一般”对象(即没有从其他特殊的服务基类继承的对象)暴露为企业服务或远程对象,使得.NET Web services 获得依赖注入的支持,并覆盖属性元数据。此外还提供了对Windows Service的集成。

 

Spring.Data 库提供了数据访问层的抽象,可以被多个数据访问提供者(从ADO.NET 到多个ORM 提供者)应用。它还包含一个对ADO.NET的抽象层,移除了为ADO.NET编写可怕的编码和声明性的事务管理的必要。

 

Spring.ORM库提供了对常见对象关系映射库的的集成,提供了一些功能,比如对声明性事务管理的支持。

      第一个Spring.NET的程序

n        建立项目

项目名称为:SpringSampleNameSpace为“OKEC.Sample.Spring”。

 

n        添加HelloTest

HelloTest.cs

using System;

namespace OKEC.Sample.Spring

{

    ///

    /// HelloTest 的摘要说明。

    ///

    public class HelloTest

    {

        public HelloTest()

        {

              //

              // TODO: 在此处添加构造函数逻辑

              //

        }

        public void Test()

        {

              Console.WriteLine("This is Spring.NET Sample Test!");

              Console.WriteLine("Please press Enter close the windows!");

              Console.ReadLine();//让程序停留,回车关闭。

        }

    }

}

 

n        添加Spring.NET的配置文件

文件名:Spring_bean.xml,属性设置为:嵌入的资源/ Embedded Resource

        xsi:schemaLocation="

        /xsd/spring-objects.xsd">

 

 

n        建立Spring.NET的容器初始化对像

SpringContext.cs

using System;

using Spring.Core;

using Spring.Aop;

using System;

using Spring.Core;

using Spring.Aop;

using Spring.Context;

using Spring.Context.Support;

namespace OKEC.Sample.Spring

{

    ///

    /// SpringFactory 的摘要说明。

    ///

    public class SpringContext

    {

        public SpringContext()

        {

              //

              // TODO: 在此处添加构造函数逻辑

              //

        }

        private static bool isInit = false;

        private static IApplicationContext context;

        public static void init()

        {

              string[] xmlFiles = new string[1];           

              xmlFiles[0] = "assembly://SpringSample/OKEC.Sample.Spring/Spring_bean.xml";

              context = new XmlApplicationContext(xmlFiles);

              isInit = true;

        }

        public static IApplicationContext Context

        {

              get{

                  if(!isInit)

                  {

                      init();

                  }

                  return context;

              }

        }

    }

}

 

n        添加启动程序

StartMain.cs

using System;

namespace OKEC.Sample.Spring

{

    ///

    /// StartMain 的摘要说明。

    ///

    public class StartMain

    {

        public StartMain()

        {

              //

              // TODO: 在此处添加构造函数逻辑

              //

        }

        [STAThread]

        static void Main()

        {

              //Startup Spring Content

              SpringContext.init();

 

              //Test Spring IOC

              HelloTest test = (HelloTest)SpringContext.Context.GetObject("Hello");

              test.Test();

        }

    }

}

n        运行程序

结果为:

This is Spring.NET Sample Test!

Please press Enter close the windows!

你的第一个Spring.NET的程序成功了!

第四章 入门

      什么是Nhibernate

NHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库。Nhibernate 来源于非常优秀的基于JavaHibernate 关系型持久化工具。

NHibernate 从数据库底层来持久化你的.Net 对象到关系型数据库。NHibernate 为你处理这些,远胜于你不得不写SQL去从数据库存取对象。你的代码仅仅和对象关联,NHibernat 自动产生SQL语句,并确保对象提交到正确的表和字段中去。

      Nhibernate概述

NHibernate体系结构的非常高层的概览:

这幅图展示了NHibernate使用数据库和配置文件数据来为应用程序提供持久化服务(和持久化的对象)。

我们试图显示更多NHibernate运行时体系结构的细节。 但挺不幸的,NHibernate是比较灵活的并且提供了好几种不同的运行方式。我们展示一下两种极端情况。轻型体系中,应用程序自己提供ADO.NET连接,并且自行管理事务。这种方式使用了NHibernate API的一个最小子集。

全面解决体系中,对于应用程序来说,所有的底层ADO.NET API都被抽象了,NHibernate会替你照管所有的细节。

 

下面是图中一些对象的定义:

SessionFactory (NHibernate.ISessionFactory)

对属于单一数据库的编译过的映射文件的一个线程安全的,不可变的缓存快照。它是Session的工厂,是ConnectionProvider的客户。可以持有一个可选的(第二级)数据缓存,可以在进程级别或集群级别保存可以在事物中重用的数据。

会话,Session (NHibernate.ISession)

单线程,生命期短促的对象,代表应用程序和持久化层之间的一次对话。封装了一个ADO.NET连接。也是Transaction的工厂。保存有必需的(第一级)持久化对象的缓存,用于遍历对象图,或者通过标识符查找对象。

持久化对象(Persistent)及其集合(Collections)

生命期短促的单线程的对象,包含了持久化状态和商业功能。它们可能是普通的对象,唯一特别的是他们现在从属于且仅从属于一个Session。一旦Session被关闭,他们都将从Session中取消联系,可以在任何程序层自由使用(比如,直接作为传送到表现层的DTO,数据传输对象)。

临时对象(Transient Object)及其集合(Collection

目前没有从属于一个Session的持久化类的实例。他们可能是刚刚被程序实例化,还没有来得及被持久化,或者是被一个已经关闭的Session所实例化的。

事务Transaction (NHibernate.ITransaction)

(可选) 单线程,生命期短促的对象,应用程序用它来表示一批工作的原子操作。是底层的ADO.NET事务的抽象。一个Session某些情况下可能跨越多个Transaction 事务。

ConnectionProvider (NHibernate.Connection.ConnectionProvider)

(可选)ADO.NET连接的工厂。从底层的IDbConnection抽象而来。对应用程序不可见,但可以被开发者扩展/实现。

TransactionFactory (net.sf.hibernate.TransactionFactory)

(可选)事务实例的工厂。对应用程序不可见,但可以被开发者扩展/实现。

在上面的轻型结构中,程序没有使用Transaction / TransactionFactory 或者ConnectionProvider API,直接和ADO.NET对话了

 

三、       NHibernate 程序

任何熟悉Hibernate的人会发现这篇指南和Glen Smith A Hitchhiker's Guide to Hibernate 非常相近。这里的内容正是基于他的指南,因此所有的感谢都应该给与他。

 

NHibernate的文档并非每处都和Hibernate的文档一致。然而,项目的相似应该能使读者通过读Hibernate的文档来很好的理解NHibernate如何工作。

 

这篇文档意在让你尽可能快的开始使用NHibernate。它将介绍如何持久化一个简单的对象到一张表里。想得到更多的复杂的例子,可以参考NUnit测试及附带代码。

我们将进行以下步骤。

1.新建一个将要持久化.Net对象的表

2.构建一个可以让NHibernate知道如何持久化对象属性的映射文件

3.构建一个需要被持久化的.Net

4.构建一个存放NHibernater的配置文件的对像

5.使用NHibernateAPI测试你的第一个NHibernate程序

 

n        新建项目

项目名称为:NHibernateSample,名字空间:OKEC.Sample.NHibernate

n        建立数据表

数据库为SQLServer2000,表名为:my_users

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[my_users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

    drop table [dbo].[my_users]

    GO

    CREATE TABLE [dbo].[my_users] (

    [LogonId] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,

    [UserName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,

    [Password] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,

    [EmailAddress] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,

    [LastLogon] [datetime] NULL

    ) ON [PRIMARY]

    GO

    ALTER TABLE [dbo].[my_users] ADD

    CONSTRAINT [PK_my_users] PRIMARY KEY  CLUSTERED

    (

    [LogonId]

    )  ON [PRIMARY]

    GO

 

n        建立XML对像映射文件

现在我们有数据表和需要去映射它的.Net类。我们需要一种方式去让NHibernate知道如何从一个映射到另一个。这个任务依赖于映射文件来完成。最易于管理的办法是为每一个类写一个映射文件,如果你命名它是User.hbm.xml并且把它放在和类的同一个目录里,NHiberante将会使得事情简单起来。下面是User.hbm.xml的例子:

   

       

       

               

       

       

       

       

   

注意事项:在Visual Studio 2003/2005中要将此文件的属性设置为“嵌入的资源”(Embedded Resource

n        建立对像

对像定义:User.cs

using System;

namespace OKEC.Sample.NHibernate.NHibernateTest

{

    ///

    /// Summary description for User.

    ///

    public class User

    {

        private string id;

        private string userName;

        private string password;

        private string emailAddress;

        private DateTime lastLogon;

        public User()

        {

        }

        public string Id

        {

              get { return id; }

              set { id = value; }

        }

        public string UserName

        {

              get { return userName; }

              set { userName = value; }

        }

        public string Password

        {

              get { return password; }

              set { password = value; }

        }

        public string EmailAddress

        {

              get { return emailAddress; }

              set { emailAddress = value; }

        }

        public DateTime LastLogon

        {

              get { return lastLogon; }

              set { lastLogon = value; }

        }

    }

}

 

n        编写Nhibernate的初始化配置程序

程序名:MyConfiguration.cs

using System;

using NHibernate.Cfg;

namespace OKEC.Sample.NHibernate.NHibernateTest

{

    ///

    /// MyConfiguration 的摘要说明。

    ///

    public class MyConfiguration

    {

        public MyConfiguration()

        {

              //

              // TODO: 在此处添加构造函数逻辑

              //

        }

        public Configuration GetConfig()

        {

              try

              {

                  Configuration cfg = new Configuration();              cfg.SetProperty("hibernate.connection.provider","NHibernate.Connection.DriverConnectionProvider");

                  //请修改此行中的SQLServer的配置

                  cfg.SetProperty("hibernate.connection.connection_string","Data Source=192.168.88.15;Database=liluhua;User ID=sa;Password=sa;Trusted_Connection=False");

                  cfg.SetProperty("hibernate.dialect","NHibernate.Dialect.MsSql2000Dialect");

                  cfg.SetProperty("hibernate.connection.driver_class","NHibernate.Driver.SqlClientDriver");

                  cfg.AddAssembly("NHibernateSample");

                  return cfg;

              }

              catch(Exception ex)

              {

                  Console.WriteLine(ex.Message);

                  Console.WriteLine(ex.StackTrace);

              }

              return null;

        }

    }

}

n        编写调用程序

准备好上面的一切,我们就可以开始编辑启动程序,来测试你的第一个Nhibernate程序了。

程序名:UserFixture.cs

using System;

using System.Collections;

using NHibernate;

using NHibernate.Cfg;

using NHibernate.Expression;

namespace OKEC.Sample.NHibernate.NHibernateTest

{

    ///

    /// UserFixture 的摘要说明。

    ///

    public class UserFixture

    {

        public UserFixture()

        {

              //

              // TODO: 在此处添加构造函数逻辑

              //

        }

        public void ValidateQuickStart()

        {

              try

              {

                  //得到NHibernate的配置

                  MyConfiguration config = new MyConfiguration();

                  Configuration cfg = config.GetConfig();

 

                  ISessionFactory factory = cfg.BuildSessionFactory();

                  ISession session = factory.OpenSession();

                  ITransaction transaction = session.BeginTransaction();

 

                  User newUser = null;

                  try

                  {

                      newUser = (User)session.Load(typeof(User), "joe_cool");

                  }

                  catch

                  {

                  }

                  if(newUser==null)

                  {

                      newUser = new User();

                      newUser.Id = "joe_cool";

                      newUser.UserName = "Joseph Cool";

                      newUser.Password = "abc123";

                      newUser.EmailAddress = "joe@cool.com";

                      newUser.LastLogon = DateTime.Now;

 

                      // Tell NHibernate that this object should be saved

                      session.Save(newUser);

                  }           

 

                  // commit all of the changes to the DB and close the ISession

                  transaction.Commit();

                  session.Close();

 

                  // open another session to retrieve the just inserted user

                  session = factory.OpenSession();

 

                  User joeCool = (User)session.Load(typeof(User), "joe_cool");

 

                  // set Joe Cool's Last Login property

                  joeCool.LastLogon = DateTime.Now;

 

                  // flush the changes from the Session to the Database

                  session.Flush();

 

                  IList recentUsers = session.CreateCriteria(typeof(User))

                      .Add(Expression.Gt("LastLogon", new DateTime(2004, 03, 14, 20, 0, 0)))

                      .List();

                  foreach(User user in recentUsers)

                  {

                      //Assert.IsTrue(user.LastLogon > (new DateTime(2004, 03, 14, 20, 0, 0)) );

                      Console.WriteLine(user.UserName);

                      Console.WriteLine(user.Password);

                  }

                  session.Close();

              }

              catch(Exception ex)

              {

                  Console.WriteLine(ex.Message);

                  Console.WriteLine(ex.StackTrace);

              }

              Console.ReadLine();

        }

    }

}

n        测试你的程序

如果运行后没有出错,显示了结果,说明你的第一个NHibernate程序成功了。

Joseph Cool

abc123

 

第五章 NHibernate 的整合

我们成功的运行了自己的第一个Spring.NET程序和第一个NHibernate程序。下面我们将上面的程序整合到一个项目中来。让Spring.NET的容器来管理NHibernate

      建立新的项目(SpringNHibernateSample)

项目名称为:SpringNHibernateSample 名字空间:OKEC.Sample

      添加NHibernate程序

NHibernateSample项目的User.csUser.hbm.xml加入的新的项目中。

并修改User.hbm.xml,将其中的

 table="my_users">

改为:

 table="my_users">

 

      添加Spring.NET的程序

n        首先,需要将SpringSample项目中的HelloTest.csSpring_bean.xmlSpringContext.cs加入到新的项目,并修改其中有用到程序集相关的地方。

如将Spring_bean.xml中的:

改为:

 

n        然后,添加一个为NHibernate提供DbProvider的实现类,此类实现了Spring.Data.Common.IDbProvider接口,为NHibernate提供DbProvider所需的链接字串(ConnectionString)

using System;

using Spring.Data.Common;

namespace OKEC.Sample.Spring

{

    ///

    /// SQLPriv 的摘要说明。

    ///

    public class SQLProvider:IDbProvider

    {

        public SQLProvider()

        {

              //

              // TODO: 在此处添加构造函数逻辑

              //

        }

        #region IDbProvider 成员

        public System.Data.IDbConnection CreateConnection()

        {

              // TODO:  添加 SQLPriv.CreateConnection 实现

              return null;

        }

        public string CreateParameterName(string name)

        {

              // TODO:  添加 SQLPriv.CreateParameterName 实现

              return null;

        }

        public System.Data.IDbDataParameter CreateParameter()

        {

              // TODO:  添加 SQLPriv.CreateParameter 实现

              return null;

        }

        private string _connectionString="";

        public string ConnectionString

        {

              get

              {

                  // TODO:  添加 SQLPriv.ConnectionString getter 实现

                  return _connectionString;

              }

              set

              {

                  _connectionString = value;

                  // TODO:  添加 SQLPriv.ConnectionString setter 实现

              }

        }

        public string ExtractError(Exception e)

        {

              // TODO:  添加 SQLPriv.ExtractError 实现

              return null;

        }

        public System.Data.IDbDataAdapter CreateDataAdapter()

        {

              // TODO:  添加 SQLPriv.CreateDataAdapter 实现

              return null;

        }

        public bool IsDataAccessException(Exception e)

        {

              // TODO:  添加 SQLPriv.IsDataAccessException 实现

              return false;

        }

        public System.Data.IDbCommand CreateCommand()

        {

              // TODO:  添加 SQLPriv.CreateCommand 实现

              return null;

        }

        public object CreateCommandBuilder()

        {

              // TODO:  添加 SQLPriv.CreateCommandBuilder 实现

              return null;

        }

        public IDbMetadata DbMetadata

        {

              get

              {

                  // TODO:  添加 SQLPriv.DbMetadata getter 实现

                  return null;

              }

        }

        #endregion

    }

}

 

n        最后,添加一个Spring.Data.NHibernateNHibernate的封装对像,此对像实现对User对像数据操作,继承自

Spring.Data.NHibernate.Support.HibernateDaoSupport

using System;

using System.Collections;

using Spring.Data.NHibernate.Support;

namespace OKEC.Sample.NHibernate.NHibernateTest

{

    ///

    /// UserDao 的摘要说明。

    ///

    public class UserDao : HibernateDaoSupport

    {

        public UserDao()

        {    //

              // TODO: 在此处添加构造函数逻辑

              //

        }

        public bool SaveObject(User user)

        {

              HibernateTemplate.Save(user);

            return true;

        }

        public bool DeleteObject(User user)

        {

              HibernateTemplate.Delete(user);

              return true;

        }

        public bool UpdateObject(User user)

        {

              HibernateTemplate.Update(user);

              return true;

        }

        public IList GetAllObjectsList()

        {

              return HibernateTemplate.LoadAll(typeof(User));

        }

        public User Load(Object ID)

        {

              return (User)HibernateTemplate.Load(typeof(User),ID);

        }

    }

}

 

      添加Spring.NETNHibernate的容器配置

现在就可以在Spring.NET的容器中添加Nhibernate的配置了。

如下Spring_nhibernate.xml

<?xml version="1.0" encoding="utf-8" ?>

 

 

   

 

type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate">

   

   

       

              SpringNhibernateSample

       

   

   

       

             

key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>

             

             

             

key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/> 

       

   

 

 

 

   

   

 

 

 

type="Spring.Transaction.Interceptor.TransactionInterceptor, Spring.Data">

   

   

       

type="Spring.Transaction.Interceptor.AttributesTransactionAttributeSource, Spring.Data"/>

   

 

 

 

 

 type="OKEC.Sample.NHibernate.NHibernateTest.UserDao, SpringNHibernateSample">

       

 

 

我们现在对上面的加以细解:

下面这几行,是配置Nhibernate所需的数据库的DbProvider

   

 

下面的是对NhibernateSessionFactory的封装的对像的定义

type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate">

   

   

       

              SpringNhibernateSample

       

   

   

       

             

             

             

               

       

   

 

 

下面的是对Nhibernate中的Transaction封装对像

   

   

 

 

 

   

   

       

   

 

 

下面是对NHibernate业务操作对像的定义

type="OKEC.Sample.NHibernate.NHibernateTest.UserDao, SpringNHibernateSample">

       

 

 

      编写测试程序代码

一切准备就绪,我们就可以编写测试程序的代码了。

如下:StartMain.cs

using System;

using System.Collections;

using OKEC.Sample.NHibernate.NHibernateTest;

namespace OKEC.Sample.Spring

{

    ///

    /// StartMain 的摘要说明。

    ///

    public class StartMain

    {

        public StartMain()

        {  //

              // TODO: 在此处添加构造函数逻辑

              //

        }

        [STAThread]

        static void Main()

        {       

              //Startup Spring & NHibernate Content

              SpringContext.init();

 

              //Test Spring IOC

              HelloTest test = (HelloTest)SpringContext.Context.GetObject("Hello");

              test.Test();

 

              //Test Spring & NHibernate

              UserDao dao = SpringContext.Context.GetObject("UserDao") as UserDao;

              User newUser = null;

              try

              {

                  newUser = dao.Load("joe_cool");

              }

              catch

              {}

              if(newUser==null)

              {

                  newUser = new User();

                  newUser.Id = "joe_cool";

                  newUser.UserName = "Joseph Cool";

                  newUser.Password = "abc123";

                  newUser.EmailAddress = "joe@cool.com";

                  newUser.LastLogon = DateTime.Now;

                  // Tell NHibernate that this object should be saved

                  dao.SaveObject(newUser);

              }

              User joeCool = dao.Load("joe_cool");

              // set Joe Cool's Last Login property

              joeCool.LastLogon = DateTime.Now;

              // flush the changes from the Session to the Database

              dao.UpdateObject(joeCool);

              IList recentUsers = dao.GetAllObjectsList();

              foreach(User user in recentUsers)

              {

                  //Assert.IsTrue(user.LastLogon > (new DateTime(2004, 03, 14, 20, 0, 0)) );

                  Console.WriteLine(user.UserName);

                  Console.WriteLine(user.Password);

              }

              Console.ReadLine();//让程序停留,回车关闭。

        }

    }

}

      测试并查看结果

如果你看到了以下的输出结果,说明你已经成功了!

This is Spring.NET Sample Test!

Please press Enter close the windows!

Joseph Cool

abc123

 

第六章

待写

第七章

待写

 

第八章

待写

阅读(3770) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~