·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> [转]ASP.NET MVC Spring.NET NHibernate 整合

[转]ASP.NET MVC Spring.NET NHibernate 整合

作者:佚名      ASP.NET网站开发编辑:admin      更新时间:2022-07-23

[转]asp.net MVC SPRing.NET NHibernate 整合

请注明转载地址:http://www.cnblogs.com/arhat

在整合这三个技术之前,首先得说明一下整合的步骤,俗话说汗要一口一口吃,事要一件一件做。同理这个三个技术也是。那么在整合之前,需要对ASP.NET,Spring.NET,NHibernate有所了解,最好是有一些经验,因为平白无故的就把3个技术融合到一起,会闹些小别扭,其实就像配置化学药品一样,如果3中原料有一点出路,那么整个实验也就失败了。

在网上有很多高人都写过类似的文章,可能是鄙人不才,看了很多文章都没有把我的问题解决了,同时我在整合的过程中走了不少的弯路。今天做一下记录,防止自己忘掉。好了,言归正传。

整合原理:

我们在初中,高中都学过化学,知道有些物质是不能很好的反应,需要通过催化剂来促使两者之间更改好的反应。那么我们就把ASP.NET MVC看成是物质A,NHibernate看成是物质C。本身A+C=应用。但是由于A和C之间结合会带来开发上的一些难题(比如事务的控制),那么怎么办呢,我们可以加入催化剂Spring.NET(物质B)。这样通过B这个催化剂很好的解决了A+C之间的问题。于是公式就出来了A+B+C=应用。

当然,我们这里是程序设计而不是化学反应,所以在结合的过程中我们遵循下面的步骤。

1. ASP.NET MVC + Spring.NET

2. ASP.NET MVC + NHibernate

3. ASP.NET MVC + Spring.NET +NHibernate本章是ASP.NET,Spring.NET,NHibernate相结合的综合篇章,看过前两篇的朋友知道,前两篇文章只是ASP.NET MVC 和 Spring.NET,ASP.NET MVC 和 NHibernate的单独结合。本章是三者结合的最后一篇《 ASP.NET MVC + Spring.NET +NHibernate》。好了,开始本章的内容。本次使用的是Spring.NET 1.3.2,NHibernate3.2.0,ASP.NET MVC3。开发环境是VS2012

一、创建一个解决方案“ASH”在解决方案中创建4个项目:”Com.Symjie.Web””Com.Symjie.Model””Com.symjie.BLL””Com.Symjie.DAL”并添加他们之间的相互引用(三层知识,这里不再介绍)。如图:wps_clip_image-28214并在每个项目中都添加一个“Config”文件夹,这个文件夹用来存放Spring.NET和NHibernate的配置文件。

二、从Model入手,配置NHibernate的映射文件这里我们使用“Entity Developer”这个软件来生成NHibernate的映射文件,当然手动写也可以。把生成的文件加入到Model项目中。如图:

wps_clip_image-22399

然后把User.hbm.xml文件的属性更改为“嵌入的资源”。如图:

wps_clip_image-29493

User.cs代码:

复制代码复制代码
using System;using System.Collections;using System.ComponentModel;using System.Linq;using System.Text;using System.Collections.Generic;namespace Com.Symjie.Model{    public partial class User {            partial void OnCreated();                public User()        {            OnCreated();        }        public virtual int Uid        {            get;            set;        }        public virtual string Uname        {            get;            set;        }    }}
复制代码复制代码

User.hbm.xml文件内容:

复制代码复制代码
<?xml version="1.0" encoding="utf-8"?><hibernate-mapping assembly="Com.Symjie.Model" namespace="Com.Symjie.Model" xmlns="urn:nhibernate-mapping-2.2">  <class name="User" table="user" schema="nhibernate">    <id name="Uid" type="Int32">      <column name="uid" not-null="true" precision="10" scale="0" sql-type="int" />      <generator class="identity" />    </id>    <property name="Uname" type="String">      <column name="uname" not-null="false" length="50" sql-type="varchar" />    </property>  </class></hibernate-mapping>
复制代码复制代码

三、从DAL入手,先让Spring.NET 和 NHibernate相结合之所以从DAL入手,是因为Spring.NET 和 NHibernate结合比较复杂(对于刚接触的朋友)。由于DAL是和数据库打交道的,所以在DAL项目中,我们要引入以下的几个DLL文件。NHibernate:NHibernnate.dllIesi.Collections.dll

Spring.NET暂时不引入,当然引入核心的dll文件也可以。如果后续课程用到,我们在加上去。

wps_clip_image-16208

创建三个文件分别为:INHibernatesessionFactory.cs提供对ISession的管理:

复制代码复制代码
public interface INHibernateSessionFactory{NHibernate.ISessionFactory SessionFactory { set; get; }}
复制代码复制代码

ID_User.cs 是一个对D_User的抽象接口,定义实现的方法

复制代码复制代码
public interface ID_User{IList<Model.User> GetAllUsers();    }
复制代码复制代码

D_User.cs 是具体的实现,要实现接口上面的两个接口,充分体现Spring.NET的Ioc。

复制代码复制代码
public class D_User:ID_User,INHibernateSessionFactory{public NHibernate.ISessionFactory SessionFactory{get;set;}public IList<Model.User> GetAllUsers(){NHibernate.ISession session =  this.SessionFactory.GetCurrentSession();            NHibernate.IQuery query = session.CreateQuery("from User");return query.List<Model.User>();}    }
复制代码复制代码

然后才是最难的一部分,就是要写Spring.NET的配置文件,让Spring.NET来管理NHibernate。首先在Config中创建一个SpringNHibernate.xml文件。这个文件时就是用来配置管理NHibernate的。同时设置为“嵌入的资源”。内容如下:

复制代码复制代码
<?xml version="1.0" encoding="utf-8" ?><objects xmlns="http://www.springframework.net"xmlns:db="http://www.springframework.net/database"xmlns:tx="http://www.springframework.net/tx"         >  <!--描述-->  <description>使用Spring.NET管理NHibernate  </description>  <!-- 通过主应用程序的上下文配置文件引用 ,其实就是要读取Web.config中的databaseSettings的内容,和下面的db:provider相互作用-->  <object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core">    <property name="ConfigSections" value="databaseSettings"/>  </object>  <!-- 数据库的配置 ,其实就是提供数据库的连接字符串还有相应的数据库dll文件,这里使用的是MySQL-5.2.3,而在项目无需引用MySql.Data.dll文件(可能自带吧)。其中$符号的内容是占位符,它的值在Web.config中进行设置-->  <db:provider id="DbProvider"provider="MySql-5.2.3"connectionString="server=${db.server};Database=${db.database};uid=${db.user};pwd=${db.passWord}"               />  <!-- NHibernate 配置 -->  <!-- 可以通过 name 为其指定别名 name="SessionFactory" 这个用来设置NHibernate的Session的管理对象,使用Spring.NET提供的LocalSessionFactoryObject来管理NHibernate的Session。因为NHibernate的Session是线程不安全的。-->  <object id="MyNHibernateSessionFactory"type="Spring.Data.NHibernate.LocalSessionFactoryObject,Spring.Data.NHibernate32"          >    <!-- 关于数据库连接的配置,直接使用 DbProvider 中的设置,这样,不需要为 Hibernate 再提供连接串和驱动 -->    <property name="DbProvider" ref="DbProvider"/>    <!-- 包含有映射文件的程序集,需要分析的hbm程序集名称 -->    <property name="MappingAssemblies">      <list>        <value>Com.Symjie.Model</value>      </list>    </property>    <!-- 其他的参数 -->    <property name="HibernateProperties">      <dictionary>        <!-- 方言 -->        <entry key="dialect" value="NHibernate.Dialect.MySQL5Dialect"/>        <entry key="use_proxy_validator" value="false" />        <entry key="show_sql" value="true"/>      </dictionary>    </property>    <!-- 和Spring.NET结合使用事务,必须设置此项 -->    <property name="ExposeTransactionAwareSessionFactory" value="true" />  </object></objects>
复制代码复制代码

然后在Config中在创建一个”Objects.xml”,这个文件就是Spring.NET的对象文件,用来实现IoC的。在D_User中有一个属性SessionFactory。这个属性和“MyNHiber