1

Spring .NET と NHibernate を ASP .NET MVC と共に使用しています。

最近、トランザクション管理を Spring と統合することにしました。Spring は、サービスの [Transaction()] 属性を使用してトランザクションを簡単に統合する方法を提供することを理解しています。これを機能させました。

私の古いアーキテクチャは、AOP を使用してアドバイスを介してサービスへの呼び出しをインターセプトし、このメソッドの呼び出しが許可されているかどうかを確認するものでした。

CALL --> Tx Advice --> Permission Advice --> Service --> execute logic --> Tx Advice 内の Tx のコミット/ロールバック --> End CALL。

これで、サービス メソッドの Transaction() 属性により、Tx アドバイスは不要になりました。

ただし、トランザクションが PermissionAdvice に到達する前に開始されるようにするにはどうすればよいですか。

ファイル: services.xml

<object id="BusinessLogicServiceBase" type="Winito.Server.Services.Impl.BusinessLogicService, Winito.Server">
<property name="ObjectPersistenceManager" ref="ObjectPersistenceManager" />
<property name="StatisticsStandingsManager" ref="StatisticsStandingsManager" />

....
</object>

<tx:attribute-driven/>

ファイル: Dao.xml

<object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core">
<property name="ConfigSections" value="databaseSettings"/>
</object>

<!-- Database and NHibernate Configuration -->
<!-- SqlServer-2.0 -->
<db:provider id="DbProvider" provider="System.Data.SqlClient" connectionString=""                  />

<!-- NHibernate Configuration -->
<object id="NHibernateSessionFactory" type="Winito.Data.Base.NHibernate.CustomLocalSessionFactoryObject, Winito.Data.Base">
<property name="DbProvider" ref="DbProvider"/>
<property name="MappingAssemblies">
<list>
<value>Winito.Core</value>
  </list>
</property>
<property name="HibernateProperties">
  <dictionary>
    <entry key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
    <entry key="use_proxy_validator" value="false" />
    <entry key="dialect" value="NHibernate.Dialect.MsSql2008Dialect"/>
    <entry key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
    <entry key="connection.isolation" value="ReadCommitted" />
    <!--<property name="cache.provider_class">NHibernate.Caches.SysCache.SysCacheProvider,NHibernate.Caches.SysCache</property>-->
    <!--<property name="cache.use_second_level_cache">true</property>-->
    <entry key="command_timeout" value="340" />
    <entry key="use_outer_join" value="true" />
    <entry key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" />
  </dictionary>
</property>

<!-- provides integation with Spring's declarative transaction management features -->
<property name="ExposeTransactionAwareSessionFactory" value="true" />
</object>

<!-- Transaction Management Strategy - local database transactions -->
<object id="transactionManager"        type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate30">

<property name="DbProvider" ref="DbProvider"/>
<property name="SessionFactory" ref="NHibernateSessionFactory"/>

</object>

<!-- Exception translation object post processor -->
<object type="Spring.Dao.Attributes.PersistenceExceptionTranslationPostProcessor, Spring.Data"/>

古いコード:

<object id="BusinessLogicService" type="Spring.Aop.Framework.ProxyFactoryObject">
<property name="target" ref="BusinessLogicServiceBase" />
<property name="interceptorNames">
  <list>
    <!-- <value>TimingAdvice</value> -->
    <value>TransactionalAdvice</value>
    <value>PermissionAdviceBusinessLogic</value>
  </list>
</property>
</object>
4

1 に答える 1

0

宣言型トランザクション管理に関する Spring のドキュメントで、属性駆動型タグで順序要素を指定できることを読みました。

何かのようなもの

<tx:attribute-driven transaction-manager="transactionManager" order="1" />

order の値は、 aop アドバイスの順序付けの通常のルールで使用されます。

于 2011-03-07T09:38:53.273 に答える