ASP.NET MVC Spring.NET NHibernate 整合

請註明轉載地址:http://www.cnblogs.com/arhat

在整合這三個技術以前,首先得說明一下整合的步驟,俗話說汗要一口一口吃,事要一件一件作。同理這個三個技術也是。那麼在整合以前,須要對
ASP.NET,Spring.NET,NHibernate有所瞭解,最好是有一些經驗,由於無緣無故的就把3個技術融合到一塊兒,會鬧些小別扭,其實就像配置化學藥品同樣,若是3中原料有一點出路,那麼整個實驗也就失敗了。html

在網上有不少高人都寫過相似的文章,多是鄙人不才,看了不少文章都沒有把個人問題解決了,同時我在整合的過程當中走了很多的彎路。今天作一下記錄,防止本身忘掉。好了,言歸正傳。web

整合原理:spring

咱們在初中,高中都學過化學,知道有些物質是不能很好的反應,須要經過催化劑來促使二者之間更改好的反應。那麼咱們就把ASP.NET MVC當作是物質A,NHibernate當作是物質C。自己A+C=應用。可是因爲A和C之間結合會帶來開發上的一些難題(好比事務的控制),那麼怎麼辦呢,咱們能夠加入催化劑Spring.NET(物質B)。這樣經過B這個催化劑很好的解決了A+C之間的問題。因而公式就出來了A+B+C=應用。sql

固然,咱們這裏是程序設計而不是化學反應,因此在結合的過程當中咱們遵循下面的步驟。數據庫

1. ASP.NET MVC + Spring.NET安全

2. ASP.NET MVC + NHibernatesession

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。開發環境是VS2012app

1、建立一個解決方案「ASH」
在解決方案中建立4個項目:
」Com.Symjie.Web」
」Com.Symjie.Model」
」Com.symjie.BLL」
」Com.Symjie.DAL」
並添加他們之間的相互引用(三層知識,這裏再也不介紹)。如圖:
wps_clip_image-28214
並在每一個項目中都添加一個「Config」文件夾,這個文件夾用來存放Spring.NET和NHibernate的配置文件。ide

2、從Model入手,配置NHibernate的映射文件
這裏咱們使用「Entity Developer」這個軟件來生成NHibernate的映射文件,固然手動寫也能夠。把生成的文件加入到Model項目中。如圖:ui

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>


3、從DAL入手,先讓Spring.NET 和 NHibernate相結合
之因此從DAL入手,是由於Spring.NET 和 NHibernate結合比較複雜(對於剛接觸的朋友)。因爲DAL是和數據庫打交道的,因此在DAL項目中,咱們要引入如下的幾個DLL文件。
NHibernate:
NHibernnate.dll
Iesi.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。這個屬性和「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的結合,下面就可使用了。

4、完成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預覽一下吧。

wps_clip_image-11026
這個只是個見得結合例子,但願可以對各位朋友有一個拋磚引玉的做用。真累啊,寫篇文章真是不容易啊。

源碼下載

相關文章
相關標籤/搜索