zoukankan      html  css  js  c++  java
  • 一个NHibernate+Spring.Net小例子

           看到博客园有很多人用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

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain">
    
      <class name="Person" table="T_Person" lazy="true" >
        <id name="Id" type="Guid" column="PersonID">
          <generator class="assigned"/>
        </id>
    
        <property name="Name" type="string">
          <column name="Name" length="50"/>
        </property>
    
      </class>
    
    </hibernate-mapping>
    

     将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,包含了配置数据库的一些相关信息

    <?xml version="1.0" encoding="utf-8"?>
    
    <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
      
      <session-factory name="Domain">
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        <property name="connection.connection_string">
          server=(local);database=NHibernateDemo;uid=sa;pwd=123456;
        </property>
        <property name="adonet.batch_size">10</property>
        <property name="show_sql">true</property>
        <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
        <property name="use_outer_join">true</property>
        <property name="command_timeout">60</property>
        <property name="hbm2ddl.auto">update</property>
        <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
        <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
        <mapping assembly="Domain"/>
      </session-factory>
      
    </hibernate-configuration>
    

    添加app.config文件,在这个文件里包含了需要注入的对象,这里只注入了PersonDao:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    
      <configSections>
        <sectionGroup name="spring">
          <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" />
          <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
        </sectionGroup>
      </configSections>
    
      <spring>
    
        <context>
          <resource uri="config://spring/objects" />
        </context>
    
        <objects xmlns="http://www.springframework.net">
          <description>一个简单的控制反转例子</description>
    
    
          <object id="PersonDao" type="Dao.PersonDao, Dao" />
    
    
        </objects>
    
      </spring>
    
    </configuration>
    

    再编写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
        {
            /// <summary>
            /// In order to generate table T_Person in database NHibernateDemo.
            /// </summary>
            [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);
                }         
            }
        }
    }
    

    运行这个测试,可以看到数据已添加进去。

     

  • 相关阅读:
    [UE4]roll pitch yaw
    [UE4]用向量表示方向
    [UE4]关闭自动曝光
    Mysql数据库常用分库和分表方式
    mycat分库分表 mod-long
    windows安装mycat(转)
    Mycat读写分离、主从切换学习(转)
    Windows版Mycat结合mysql安装配置+水平切分(转载)
    数据库高性能读写分离集群操作说明
    spring MVC、mybatis配置读写分离,ReplicationDriver(转载)
  • 原文地址:https://www.cnblogs.com/GaoHuhu/p/2584457.html
Copyright © 2011-2022 走看看