看到博客园有很多人用Spring.Net和NHibernate这两个框架,所以自己也想学习一下,这是我写的一个关于NHibernate和Spring.Net结合起来的小例子,比较简单,只实现了一个简单的增加信息的功能。不知道结合的合不合理,希望大家给予批评。
总体思路为:
1、编写实体类Person和映射文件Person.hbm.xml
2、使用NHibernate生成表T_Person
3、编写接口IPersonDao,用PersonDao类实现该接口
4、使用Spring.Net实现增加信息的功能
5、测试工具是用的Resharper里自带的测试工具。
该例子的框架如下:
实现步骤:
1、新建解决方案SpringNet_Lesson1,添加lib文件夹,里面有
这几个dll。
2、添加Domain类库项目,并编写Person类和映射文件,代码如下:
Person.cs
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Domain{ public class Person { public virtual Guid Id { get; set; } public virtual string Name { get; set; } }}
Person.hbm.xml
将Person.hbm.xml文件的属性设置为嵌入的资源,
3、添加类库项目Dao,编写IPersonDao接口和PersonDao类:
IPersonDao.cs
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Domain;namespace Dao{ public interface IPersonDao { object Save(Person person); }}
PersonDao.cs
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Domain;using NHibernate;using NHibernate.Cfg;namespace Dao{ public class PersonDao : IPersonDao { private ISessionFactory sessionFactory; public PersonDao() { var cfg = new Configuration().Configure("Config/hibernate.cfg.xml"); sessionFactory = cfg.BuildSessionFactory(); } public object Save(Person person) { using (ISession session = sessionFactory.OpenSession()) { var id = session.Save(person); session.Flush(); return id; } } }}
4、添加类库Test,用于测试。
在类库下有一个Config文件夹,里面有这么一个文件hibernate.cfg.xml,包含了配置数据库的一些相关信息
NHibernate.Driver.SqlClientDriver server=(local);database=NHibernateDemo;uid=sa;pwd=123456; 10 true NHibernate.Dialect.MsSql2008Dialect true 60 update true 1, false 0, yes 'Y', no 'N' NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu
添加app.config文件,在这个文件里包含了需要注入的对象,这里只注入了PersonDao:
一个简单的控制反转例子
再编写PersonInit.cs类,用于生成表结构
using System;using System.Collections.Generic;using System.Linq;using System.Text;using NHibernate;using NHibernate.Cfg;using NUnit.Framework;namespace Test{ [TestFixture] public class PersonInit { ////// In order to generate table T_Person in database NHibernateDemo. /// [Test] public void Init() { var cfg = new Configuration().Configure("Config/hibernate.cfg.xml"); using (ISessionFactory sessionFactory = cfg.BuildSessionFactory()) { } } }}
生成的表结构T_Person为:
接着编写DomainTest.cs类,用于添加数据
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Dao;using Domain;using NHibernate;using NUnit.Framework;using Spring.Context;using Spring.Context.Support;namespace Test{ [TestFixture] class DomainTest { private IPersonDao personDao; //[SetUp] //public void Init() //{ // personDao = DaoFactory.DataAccess.CreatePersonDao(); //} [Test] public void Save() { var person = new Person { Id = Guid.NewGuid(), Name = "李四" }; IApplicationContext context = ContextRegistry.GetContext(); personDao = context.GetObject("PersonDao") as IPersonDao; if (personDao != null) { var id = personDao.Save(person); Assert.NotNull(id); } } }}
运行这个测试,可以看到数据已添加进去。