Spring.Net+Nhibernate+ASP.MVC4.0+EasyUI实践(三)

本文介绍了如何在Spring.Net、Nhibernate、ASP.MVC和EasyUI环境下进行事务管理实践,包括配置、注入、方法事务属性设置等。

目录

Spring.Net+Nhibernate+ASP.MVC+EasyUI实践(一)

Spring.Net+Nhibernate+ASP.MVC+EasyUI实践(二)

Spring.Net+Nhibernate+ASP.MVC+EasyUI实践(三)

Spring.Net+Nhibernate+ASP.MVC+EasyUI实践(四)

 

测试spring对事务管理的支持情况

PROPAGATION_REQUIRED

支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY

支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

Manager.xml中事物管理器的配置情况如下

  <!--事物管理器-->
  <object id="BaseTransactionManager"  type="Spring.Transaction.Interceptor.TransactionProxyFactoryObject, Spring.Data" abstract="true">
    <property name="PlatformTransactionManager" ref="transactionManager"/>
    <property name="TransactionAttributes">
      <name-values>
        <!--增加-->
        <add key="Save*" value="PROPAGATION_REQUIRED"/>
        <!--修改-->
        <add key="Update*" value="PROPAGATION_REQUIRED"/>
        <!--删除-->
        <add key="Delete*" value="PROPAGATION_REQUIRED"/>
        <!--获取-->
        <add key="Get*" value="PROPAGATION_REQUIRED"/>
        <!--浏览-->
        <add key="Find*" value="PROPAGATION_SUPPORTS,readOnly"/>
        <!--检索-->
        <add key="Search*" value="PROPAGATION_SUPPORTS,readOnly"/>
        <!--报表-->
        <add key="Query*" value="PROPAGATION_SUPPORTS,readOnly"/>
        <!--载入-->
        <add key="Load*" value="PROPAGATION_SUPPORTS,readOnly"/>
        <!--报表-->
        <add key="Report*" value="PROPAGATION_SUPPORTS,readOnly"/>
        <!--其它-->
        <add key="*" value="PROPAGATION_SUPPORTS"/>
        <!--<add key="*" value="PROPAGATION_REQUIRED"/>-->
      </name-values>
    </property>
  </object>

如果使用<add key="*" value="PROPAGATION_REQUIRED"/>,则注入了Target的Bll中不是上述save,deletee开头的方法都将以事务方式执行。

如果想单独对想对某一方法添加事务,则选择<add key="*" value="PROPAGATION_SUPPORTS"/>

然后在相应函数前面添加标记[Transaction],并在该项目中添加spring.data.Nhibernate32.dll

如在BLL的UserDepInfoManager.cs添加事务驱动的方法,当然IBLL中的接口也要相应修改

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FinanceWebSys.Model;
using FinanceWebSys.IBLL;
using Spring.Transaction.Interceptor;


namespace FinanceWebSys.BLL
{
    public class UserDepInfoManager:GenericManager<UserDepInfo>,IUserDepInfoManager
    {
        public IList<UserDepInfo> LoadAllByPage(out long total, int page, int rows, string order, string sort) 
        {
            return ((FinanceWebSys.IDao.IUserDepInfoRepository)(this.CurrentRepository)).LoadAllByPage(out total, page, rows, order, sort);
        }
        [Transaction]
        public void CreateUser(UserDepInfo user)
        {
            ((FinanceWebSys.IDao.IUserDepInfoRepository)(this.CurrentRepository)).Save(user);
            if (user.DepID < 2)
            {
                throw new Exception("wrong");
            }
        }
    }
}


HomeController做测试

    public class HomeController : Controller
    {
        static log4net.ILog logger = log4net.LogManager.GetLogger("Logger");
        public string Message { get; set; }
        public IUserDepInfoManager UserDepInfoManager { get; set; }
        public ActionResult Index()
        {
            var a = UserDepInfoManager.Get(1);
            ViewBag.Message = a.DepName + a.Id;
            try
            {
                log4net.Config.XmlConfigurator.Configure();
                UserDepInfo user = new UserDepInfo { DepID = 1, DepName = "liuhuan" };
                UserDepInfoManager.CreateUser(user);
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                throw ex;
            }
            return View();
        }


Web.config配置添加

  <configSections>
    ……
    <sectionGroup name="spring">
      ……
      <!--<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>-->
      <section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core" />
    </sectionGroup>
  </configSections>
  <!--spring的配置文件-->
  <spring>
    <parsers>
      <!--<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data" />-->
      <parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data" />
    </parsers>
……
  </spring>


修改Manager.xml

<?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">
  <object id="transactionManager"
      type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate32">
    <property name="DbProvider" ref="DbProvider"/>
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>
  <!--事务切面-->
  <tx:attribute-driven/>


完整版的web.config

<?xml version="1.0" encoding="utf-8"?>
<!--
  有关如何配置 ASP.NET 应用程序的详细信息,请访问
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!--spring对mvc的注入-->
    <sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc3" />
      <!--<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>-->
      <section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core" />
    </sectionGroup>
    <!--log4net节点-->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    <!--数据库设置-->
    <section name="databaseSettings" type="System.Configuration.NameValueSectionHandler" />    
  </configSections>
  <!--spring的配置文件-->
  <spring>
    <parsers>
      <!--<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data" />-->
      <parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data" />
    </parsers>
    <context>
      <!--Web-->
      <resource uri="file://~/Configs/Controllers.xml" />
      <!--BLL-->
      <resource uri="file://~/Configs/Manager.xml" />
      <!--Dao-->
      <resource uri="file://~/Configs/Repository.xml" />
    </context>
  </spring>
  <!--数据库连接字符串-->
  <databaseSettings>
    <add key="provider" value="Npgsql-2.0" />
    <add key="connectionString" value="Server=127.0.0.1;Port=5432;User Id=postgres;Password=zllzh;Database=FinanceWebDb;" />
    <add key="dialect" value="NHibernate.Dialect.PostgreSQLDialect" />
    <add key="driver_class" value="NHibernate.Driver.NpgsqlDriver" />
    <!--自动建表-->
    <add key="hbm2ddl.auto" value="update" />
  </databaseSettings>
  <!--log4net-->
  <log4net debug="true">
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <param name="File" value="Logs\Log.log" />
      <param name="datePattern" value="MM-dd HH:mm" />
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
    </appender>
    <appender name="HttpTraceAppender" type="log4net.Appender.ASPNetTraceAppender">
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
    </appender>
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
    </appender>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Logs/Log.log" />
      <param name="AppendToFile" value="true" />
      <param name="MaxSizeRollBackups" value="10" />
      <param name="MaximumFileSize" value="100K" />
      <param name="RollingStyle" value="Size" />
      <param name="StaticLogFileName" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
    </appender>
    <root>
      <level value="ERROR" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
  </log4net>
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-FinanceWebSys-20121030155901;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-FinanceWebSys-20121030155901.mdf" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    <!--spring新增-->
    <!--<add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="NHibernateSessionFactory" />-->
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" 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.Optimization" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
    <!--新增-->
    <httpModules>
      <!--<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate32" />-->
    </httpModules>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Common.Logging" publicKeyToken="af08829b84f0328e" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.2.0.0" newVersion="1.2.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值