zoukankan      html  css  js  c++  java
  • 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.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的结合,下面就可以使用了。

    四、完成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
    这个只是个见得结合例子,希望能够对各位朋友有一个抛砖引玉的作用。真累啊,写篇文章真是不容易啊。

    源码下载

  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    《EffectiveJava中文第二版》 高清PDF下载
    《MoreEffectiveC++中文版》 pdf 下载
    《啊哈c语言》 高清 PDF 下载
  • 原文地址:https://www.cnblogs.com/arhat/p/3541046.html
Copyright © 2011-2022 走看看