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

  • 相关阅读:
    Apache ActiveMQ任意文件写入漏洞(CVE-2016-3088)复现
    Apache ActiveMQ序列化漏洞(CVE-2015-5254)复现
    Jenkins Java 反序列化远程执行代码漏洞(CVE-2017-1000353)
    jenkins未授权访问漏洞
    jenkins弱口令漏洞
    jboss 未授权访问漏洞复现
    jboss反序列化漏洞复现(CVE-2017-7504)
    C++中的强制类型转换
    new/delete与命名空间
    函数默认参数与占位参数
  • 原文地址:https://www.cnblogs.com/bluewhale84/p/4113494.html
Copyright © 2011-2022 走看看