請注明轉載地址: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預覽一下吧。