[转]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” 
并添加他们之间的相互引用(三层知识,这里不再介绍)。如图: 
 
并在每个项目中都添加一个“Config”文件夹,这个文件夹用来存放Spring.NET和NHibernate的配置文件。

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

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

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.dll 
Iesi.Collections.dll

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

创建三个文件分别为: 
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。这个属性和“MyNHibernateSessionFactory”要进行关联,换句话说在SpringNHibernate中定义的MyNHibernateSessionFactory对象就是SessionFactory的实例。那么就需要把这个对象注入到D_User的SessionFactory属性中。同时这是Objects.xml设置为“嵌入的资源”。 
Objects.xml内容如下:

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

<objects xmlns="http://www.springframework.net"

xmlns:tx="http://www.springframework.net/tx">

  <object id="D_UserImpl" type="Com.Symjie.DAL.D_User, Com.Symjie.DAL"    >

    <!-- ref 表示引用的对象,注意这个的 MyNHibernateSessionFactory是SpringNHibernate中的定义的对象-->

    <property name="SessionFactory" ref="MyNHibernateSessionFactory"  />

  </object>
</objects>

这就完成了Spring.NET 和 NHibernate的结合,下面就可以使用了。

四、完成BLL层的Spring管理 
在使用之前,我们先完成BLL层的Spring管理。在BLL中创建两个文件: 
IB_User.cs定义B_User的相关属性和方法

public interface IB_User

{

DAL.ID_User D_User { set; get; }

IList<Model.User> GetAllUsers();

}

B_User.cs实现了IB_User的方法和属性

public class B_User:IB_User

{

public DAL.ID_User D_User

{

get;

set;

}

public IList<Model.User> GetAllUsers()

{

return this.D_User.GetAllUsers();

}

}

然后在Config中创建BLL.xml文件。这个文件就是Spring.NET的对象文件,用来实现IoC的。

<objects xmlns="http://www.springframework.net">

    <object id="B_UserImpl" type="Com.Symjie.BLL.B_User,Com.Symjie.BLL"    >

        <!-- ref 表示引用的对象 -->

        <property name="D_User" ref="D_UserImpl"  />

    </object>

</objects>

同时要设置BLL.xml为”嵌入的资源“。好了,到此BLL和DAL都已完成了配置,那么下面就是如何使用了。

配置Web项目和Spring.NET,NHibernate 
首先,在Web项目中我们加入Spring.NET的先关dll文件。 
Spring.Core,Spring.Data.Spring.AOP,Spring.Data.NHibernate32 
然后再Config文件夹中创建”Controllers.xml”文件,让MVC的Controller通过Spring.NET来管理,同时实现Ioc。 
创建一个HomeController和对应的视图文件。内容如下: 
HomeController.cs

public class HomeController : Controller

{

private BLL.IB_User B_User { get; set; }

public ActionResult Index()

{

ViewBag.Data = B_User.GetAllUsers();

return View();

}

}

Index.cshtml

@using Com.Symjie.Model;

@{

    Layout = null;

}

<!DOCTYPE html>

<html>

<head>

<title>Index</title>

</head>

<body>

<div>

@foreach (User user in ViewBag.Data) 

        {

@:姓名:@user.Uname<br />

        }

</div>

</body>

</html>

这一部分,主要是对Web.config的配置,其中有些地方非常重要。先看看如何配置Web.config文件。 
打开Web.config文件,开始配置Spring。

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

<!--

  有关如何配置 ASP.NET 应用程序的详细信息,请访问

  http://go.microsoft.com/fwlink/?LinkId=152368

-->

<configuration>

  <configSections>

    <sectionGroup name="spring">

      <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc3"/>

               </sectionGroup>

    <section name="databaseSettings" type="System.Configuration.NameValueSectionHandler"/>

  </configSections>

<spring>    

    <context>

      <resource uri="assembly://Com.Symjie.DAL/Com.Symjie.DAL.Config/SpringNHibernate.xml"/>

      <resource uri="assembly://Com.Symjie.DAL/Com.Symjie.DAL.Config/Objects.xml"/>

      <resource uri="assembly://Com.Symjie.BLL/Com.Symjie.BLL.Config/BLL.xml"/>

      <resource uri="file://~/Config/Controllers.xml"/>

    </context>

  </spring>

<!--

数据库相关的信息,和SpringNHibernate.xml中的相关。

-->

  <databaseSettings>

    <add key="db.server" value="127.0.0.1" />

    <add key="db.database" value="nhibernate" />

    <add key="db.user" value="root" />

    <add key="db.password" value="symjie" />

  </databaseSettings>

  <appSettings>

    <add key="webpages:Version" value="1.0.0.0" />

    <add key="ClientValidationEnabled" value="true" />

<add key="UnobtrusiveJavaScriptEnabled" value="true" />

<!--

需要在appSettings节点处配置SessionFactory的id,这个id和SpringNHibernate中的SessionFactory的对象名一样。

-->

 <add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="MyNHibernateSessionFactory"/>

  </appSettings>

  <system.web>

<!--

这个是在IIS6中的设置,如果是使用的比这个高的,请看下面的设置。注意:如果使用的vs2010开发的MVC,在应该设置此项。此项是Spring。NET用来管理NHibernate的的Session的,Session在一次请求的开始打开数据库,完成之后关闭。非常重要,否则将会报No Hibernate Session bound to thread, and configuration does not allow这个异常。

<httpModules>

           <add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate32"/>

    </httpModules>-->

    <compilation debug="true" targetFramework="4.0" />

    <authentication mode="Forms">

      <forms loginUrl="~/Account/LogOn" timeout="2880" />

    </authentication>

    <pages>

      <namespaces>

        <add namespace="System.Web.Helpers" />

        <add namespace="System.Web.Mvc" />

        <add namespace="System.Web.Mvc.Ajax" />

        <add namespace="System.Web.Mvc.Html" />

        <add namespace="System.Web.Routing" />

        <add namespace="System.Web.WebPages" />

      </namespaces>

    </pages>

  </system.web>

  <system.webServer>

<validation validateIntegratedModeConfiguration="false" />

<!--这个是在IIS7中的设置,如果是使用的比这个高的,请看下面的设置。注意:如果使用的vs2012/vs2013开发的MVC,在应该设置此项。此项是Spring。NET用来管理NHibernate的的Session的,Session在一次请求的开始打开数据库,完成之后关闭。非常重要,否则将会报No Hibernate Session bound to thread, and configuration does not allow这个异常。-->

<modules runAllManagedModulesForAllRequests="true" >

      <add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate32"/>

    </modules>

  </system.webServer>

  <runtime>

    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

      <dependentAssembly>

        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />

        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />

      </dependentAssembly>

    </assemblyBinding>

  </runtime> 

  <connectionStrings/>

</configuration>

最后不要忘了让Global.asax继承Spring.Web.Mvc.SpringMvcApplication

好了,到此,我们就完成了三者的结合,F5预览一下吧。

时间: 2024-10-14 22:00:01

[转]ASP.NET MVC Spring.NET NHibernate 整合的相关文章

ASP.NET MVC+Spring.net+Nhibernate

第八步:Asp.NET MVC引入的DLL文件 (1) 通过上面的准备工作,可以说是我们的大部分基层代码的书写任务都已经完成了,下面才是本项目值得学习的地方,我们全部在MVC新建的项目中书写代码,因为这里用到了Spring.net,Nhibernate,MVC,easyUI等,所以非常值得我们去研究,当然我的写法可能也有问题,希望我们可以交流,这样我们可以共同进步. (2) 因为用到了Nhibernate,Spring.net,所以我将引入的DLL文件的截图先放在这里吧,当然,我的项目中有dll

ASP.NET MVC+EasyUI+Entity FrameWork 整合开发

本文详细讲解怎么用ASP.NET MVC+EasyUI+Entity FrameWork 来开发一个项目 对于ASP.NET MVC的Jscript库,主要引用 <script type="text/javascript" src="@Url.Content("~/Scripts/jquery-1.7.2.min.js")"></script> <script src="@Url.Content("

MVC+Spring.NET+NHibernate .NET SSH框架整合

在JAVA中,SSH框架可谓是无人不晓,就和.NET中的MVC框架一样普及.作为一个初学者,可以感受到.NET出了MVC框架以后太灵活了(相比之前的web Form),嗯,关于.NET中的MVC框架我就不多说了,推荐这位大神的<MVC知多少系列>http://www.cnblogs.com/sheng-jie/p/6291915.html.下面进入正题,.NET中也有SSH框架,他们分别指MVC+Spring.NET和NHibernate. 其中Spring.NET是典型的IOC框架,类似的还

SSM(Spring MVC +Spring+Mybatis)整合——maven工程

所谓的SSM 其实就是Spring MVC下整合mybatis. 具体的定义网络上都有,很详细. 这里只说项目的搭建步骤. 第一步 新建maven工程 工程目录如下: 配置pom.xml文件,引入所需的jar包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&q

ASP.NET MVC和jQuery DataTable整合

本文包含代码示例说明如何jQuery插件开发者可以集成到ASP.NET MVC应用程序. 下载源代码- 87.4 KB Introduction The jQuery DataTables plug-in is an excellent client-side component that can be used to create rich-functional tables in the web browser. This plug-in adds lot of functionalitie

ASP.NET MVC5微信公众平台整合开发实战教程

<ASP.NET MVC5&微信公众平台整合开发实战(响应式布局.JQuery Mobile,Windows Azure.微信核心开发)> 课程讲师:57Code 课程分类:ASP.NET MVC 适合人群:中级 课时数量:29课时 用到技术:深入MVC开发模式.C#核心语言特性.C#核心语言特性(二).视图引擎Razor 涉及项目:体育商店.微信公众平台开发 咨询QQ:1337192913(小公子) 1.1.1.背景分析 庞大的微信用户数是微信公众平台重要性的根本 微信用户的真实性使

Spring.NET教程(十九)整合NHibernate和ASP.NET MVC(基础篇)

今天带给大家的就是期待以久的ASP.net MVC与Spring.NET和NHibernate的组合,视图打造.NET版的SSH(Spring-Struts-Hibernate).是不是听到名字都很兴奋?我认为目前的ASP.NET MVC比Struts在某些功能上要好用的多,而且代码量要少,这就是我一直热衷于ASP.NET MVC的原因. 我们接着昨天的例子学习.昨天我们成功测试了带事务的业务层.接下来就是将业务层的对象注入到Controller中.我们先在Controller中写好要注入的属性

开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo(转)

热衷于开源框架探索的我发现ASP.NET MVC与jQuery easyUI的组合很给力.由于原先一直受Ext JS框架的licence所苦恼,于是痛下决心寻找一个完全免费的js框架——easyUI.它有完整的demo和强大AIP手册,使我在开发过程中得心 应手.以下是这篇博文Demo程序的演示效果: 解决方案如图1所示 图1 Domain:领域模型 Dao:持久层 Service:服务层 WebSite:表示层 Common:通用类 首页如图2所示,可以选择中文和English. 图2 英文首

[转]开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo

热衷于开源框架探索的我发现ASP.NET MVC与jQuery easyUI的组合很给力.由于原先一直受Ext JS框架的licence所苦恼,于是痛下决心寻找一个完全免费的js框架——easyUI.它有完整的demo和强大AIP手册,使我在开发过程中得心应手.以下是这篇博文Demo程序的演示效果: 解决方案如图1所示 图1 Domain:领域模型 Dao:持久层 Service:服务层 WebSite:表示层 Common:通用类 首页如图2所示,可以选择中文和English. 图2 英文首页