[转]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预览一下吧。
[转]ASP.NET MVC Spring.NET NHibernate 整合的更多相关文章
- ASP.NET MVC Spring.NET NHibernate 整合
请注明转载地址:http://www.cnblogs.com/arhat 在整合这三个技术之前,首先得说明一下整合的步骤,俗话说汗要一口一口吃,事要一件一件做.同理这个三个技术也是.那么在整合之前,需 ...
- MVC+Spring.NET+NHibernate .NET SSH框架整合 C# 委托异步 和 async /await 两种实现的异步 如何消除点击按钮时周围出现的白线? Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法
MVC+Spring.NET+NHibernate .NET SSH框架整合 在JAVA中,SSH框架可谓是无人不晓,就和.NET中的MVC框架一样普及.作为一个初学者,可以感受到.NET出了MV ...
- ASP.NET MVC Spring.NET 整合
请注明转载地址:http://www.cnblogs.com/arhat 在整合这三个技术之前,首先得说明一下整合的步骤,俗话说汗要一口一口吃,事要一件一件做.同理这个三个技术也是.那么在整合之前,需 ...
- MVC+Spring.NET+NHibernate .NET SSH框架整合
在JAVA中,SSH框架可谓是无人不晓,就和.NET中的MVC框架一样普及.作为一个初学者,可以感受到.NET出了MVC框架以后太灵活了(相比之前的web Form),嗯,关于.NET中的MVC框架我 ...
- Asp.Net MVC大型项目实践整合 NHibernate与Json序列化
通过NHibernate我们多表查询是实现了 但由于查询出来的集合中的对象“不是平的”,如何在送到UI绑定成了问题.ExtJs UI组件的数据绑定支持多种格式,如简单数组,Json,Xml.在本项目中 ...
- SSM(Spring MVC +Spring+Mybatis)整合——maven工程
所谓的SSM 其实就是Spring MVC下整合mybatis. 具体的定义网络上都有,很详细. 这里只说项目的搭建步骤. 第一步 新建maven工程 工程目录如下: 配置pom.xml文件,引入所需 ...
- ASP.NET MVC+EasyUI+Entity FrameWork 整合开发
本文详细讲解怎么用ASP.NET MVC+EasyUI+Entity FrameWork 来开发一个项目 对于ASP.NET MVC的Jscript库,主要引用 <script type=.mi ...
- ASP.NET MVC和jQuery DataTable整合
本文包含代码示例说明如何jQuery插件开发者可以集成到ASP.NET MVC应用程序. 下载源代码- 87.4 KB Introduction The jQuery DataTables plug- ...
- Spring MVC + Spring + MyBatis 框架整合
本文介绍使用SSM框架开发web项目Demo. 一.创建一个web-Poject项目 1.导入相关jar文件至lib下.“相关jar文件” --提取密码 oraw 2.修改web.xml文件 < ...
随机推荐
- ASPxGridView中如何对主从表绑定数据
注:在从表的aspxgridview中的(OnDataBinding()事件中绑定数据)-----代码如下 //绑定属性值表protected void grid2_sonTable_DataBind ...
- 【WCF 2】理解WCF框架的简单小实例
导读:上篇博客介绍了WCF框架的整体情况,然后,闲着没事儿,自己做了一个及其简单的WCF框架的例子帮助自己理解.从简单的入手,一步一步深入!本篇博客是介绍怎么用VS2012从头创建一个WCF项目,是一 ...
- nagios plugin 开发
https://nagios-plugins.org/doc/guidelines.html#DEVREQUIREMENTS https://blog.centreon.com/good-practi ...
- 将Eclipse项目导入Android Studio出现中文乱码的问题
以前一直以Eclipse开发项目,最近正在研究Android Studio的使用,首先想到到的是将Eclispe项目导入AS. 可以方便查看以前写过的代码,然后出现了中文乱码的问题,通过搜索了一些资料 ...
- leetcode 70
70. Climbing Stairs You are climbing a stair case. It takes n steps to reach to the top. Each time y ...
- 001MSP430概述
1.MSP430系列单片机的特点 (1)超低功耗:生来就是为超低功耗设计的,从CPU内核结构到片上外设,以及整个芯片的生产制造都是本着超低功耗的原则来进行的,所以是一款实实在在的超低功耗单片机: (2 ...
- C\C++ 框架和库整理(转)
[本文系外部转贴,原文地址:http://coolshell.info/c/c++/2014/12/13/c-open-project.htm]留作存档 下次造轮子前先看看现有的轮子吧 值得学习的C语 ...
- android应用商店完整版源码
这个是从一个安卓学习的网站上转载过来的,android应用商店完整版源码,大家可以看看一下吧. _op><ignore_js_op> <ignore_js_op>< ...
- 搭建高性能计算环境(五)、应用软件的安装之Amber12
应用软件通常安装在/opt目录下,这样系统中的各个用户都能方便使用,下面的软件都将安装到/opt目录. 1,上传需要的软件包Amber12.tar.gz.AmberTools13.tar.bz2.Am ...
- linux下快速删除大量文件
昨天遇到一个问题,在Linux中有一个文件夹里面含有大量的Cache文件(夹),数量级可能在百万级别,使用rm -rf ./* 删除时间慢到不可接受.Google了一下,查到了一种方法,试用了下确实比 ...