2011-07-21 7 views
0

キャッスルの自動取引管理機能については、セッションをフラッシュせずに実際にデータベースに保存する操作を取得するのが難しいです。キャッスルの自動取引管理機能については、恒久的な問題

私は、次のコンポーネント * NHibernate.dll v3.1.0.4000 * Castle.Core.dll v2.5.2.0 * Castle.Windsor.dll v2.5.3.0 * Castle.Facilitiesを使用しています.NHibernateIntegration.dllのv1.1.0.0 * Castle.Services.Transaction.dll v2.5.0.0 * Castle.Facilities.AutoTx.dll私は非常に密接に城のドキュメントに従っている

v2.5.1.0と私の問題を解決できませんでした。

My(web-)アプリケーションがMVPパターンに従います。

<Transactional()> _ 
Public Class CampusEditPresenter 
    Inherits BasePresenter(Of ICampusEditView) 

    Public Sub New(ByVal view As ICampusEditView) 
     MyBase.New(view) 
    End Sub 

    ... 

    <Transaction(TransactionMode.Requires)> _ 
    Public Overridable Sub Save() Implements ICampusEditPresenter.Save 

     ' Simplified 
     Using session As ISession = _sessionManager.OpenSession() 

      Dim campus As New Campus() 

      campus.Code = _view.Code 
      campus.ShortDescription = _view.ShortDescription 
      campus.LongDescription = _view.LongDescription 
      campus.StartDate = _view.StartDate 
      campus.EndDate = _view.EndDate 

      session.Save(campus) 

     End Using 

    End Sub 

End Class 

このプレゼンターサービスインストーラに登録されている:(ベースで)ビューによって

container.Register(_ 
    Component.For(Of CampusEditPresenter) _ 
    .Interceptors(Of DebugLoggingInterceptor) _ 
    .LifeStyle.Transient) 

と解決(トランザクション)プレゼンターサービスの主要な部分を以下に示します。

次のように私は、XML設定ファイルでNHibernateのとトランザクション施設を登録している
Public Class BasePage(Of TPresenter) 
    Inherits Page 

    Protected _presenter As TPresenter 

    ... 

    Protected Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Init 
     _presenter = _container.Resolve(Of TPresenter)(New With {Key .view = Me}) 
    End Sub 

    ... 

End Class 

Public Class CampusEdit 
Inherits BasePage(Of CampusEditPresenter) 
    Implements ICampusEditView 

    ... 

    Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSave.Click 
     _presenter.Save() 
    End Sub 

    ... 

End Class 

<facility id="transaction" type="Castle.Facilities.AutoTx.TransactionFacility, Castle.Facilities.AutoTx" /> 
<facility id="nhibernate" type="Castle.Facilities.NHibernateIntegration.NHibernateFacility, Castle.Facilities.NHibernateIntegration" isWeb="true" configurationBuilder="[removed].AutoConfigurationBuilder, [removed]"> 
    <factory id="nhibernate.factory"> 
    <settings> 
      <item key="connection.driver_class">NHibernate.Driver.OracleClientDriver, NHibernate</item> 
     <item key="connection.connection_string">[removed]</item> 
     <item key="show_sql">false</item> 
     <item key="dialect">NHibernate.Dialect.Oracle10gDialect, NHibernate</item> 
     <item key="query.substitutions">true 1, false 0, yes 'Y', no 'N'</item> 
     <item key="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</item> 
     <item key="current_session_context_class">web</item> 
     <item key="hbm2ddl.keywords">auto-quote</item> 
     </settings> 
    </factory> 
</facility> 

と私は私のWeb.configファイルにSessionWebModule HTTPモジュールを登録している:なぜこれが動作していないことによう

<httpModules> 
    <add name="NHibernateSessionWebModule" type="Castle.Facilities.NHibernateIntegration.Components.Web.SessionWebModule, Castle.Facilities.NHibernateIntegration"/> 
    ... 
</httpModules> 

任意のアイデア?

私はa)自分自身のトランザクションをISessionインスタンスからインスタンス化してこれらのトランザクションをコミットするか、またはb)自動トランザクション管理AOPメカニズムを使用してセッションインスタンスをフラッシュする手動でこれを行う必要はありません)。

私が経験していた

答えて

3

だから私はTransactionInterceptorは私のコンポーネントにregisterdを取得していませんでした働きました。

githubのからCastle.Facilities.AutomaticTransactionManagementソースをダウンロードしてステッピング後、私は私の問題を発見し、それを解決するために管理。

基本的にTransactionFacilityは、コンポーネントを構築しながら、いくつかの追加の構成貢献することができますComponentModelBuilderに、貢献者、TransactionComponentInspectorを追加します。 TransactionComponentInspectorの場合、コンポーネントの「トランザクション」クラス属性を検索し、存在する場合はコンポーネントにTransactionInterceptorを登録します。しかし、私のコンポーネントは、TransactionComponentInspectorによって決して寄付されていませんでした。

私はインストーラを使用して、コンテナの上に私のコンポーネントを登録/設定します。私は、XMLを使用してコンテナ自体を構成します。これらのインストーラは、NHibernateの統合/ロギングなどの機能と同様に、これらのインストーラを参照します。とにかく、私は、コンポーネントがトランザクションファシリティの前に登録されている可能性がある、何らかの発注問題であったと考えています。このように、TransactionFacilityの前に登録されたコンポーネントは、TransactionComponentInspectorによって寄与されなかったため、コンポーネントに登録されたTransactionInterceptorを取得しませんでした。私はこれを実現した後、手動でコンテナを構成し(正しい順序で)、すべてが動作するように見えました!!!

は今、私は試してみて、私のXML構成でこれを行う方法を動作するようになってきました。できない場合は、これをダンプして、コンテナの流暢な設定(グローバルHttpApplicationなど)に行くようにします。

[編集]下記参照:

_container = New WindsorContainer() 
' TransactionFacility must be registered before components. 
_container.AddFacility(Of TransactionFacility)() 
_container.Install(Configuration.FromXmlFile("Configs\services.xml")) 
+0

はチェックし、それらを介して起動時およびループにカーネルからすでに利用可能なハンドラを取得することです。あなたが手助けする時間があれば、私は非常に感謝しています:) – Henrik

+0

ええええええええええええええええええええええええええええええええええええええええええええええええええん: –

+0

https://github.com/haf/Castle.Transactions 「開発」ブランチに対していくつかの開発を行い、プルリクエストを送信する;)。 – Henrik

1

...私も(オープンセッションあたりのリクエストのパターンに従う)SessionWebModuleのIHttpModuleが私のエンティティを永続化する原因となるだろうと思っているだろうが、このdoesntのが起こっているように見えます非常によく似た動作。 Logging Aspect Interceptorを作成していたことが判明しました。必要に応じてロギングを適用できるように、デフォルトインターセプタセレクタを作成しました。これで、私はTransactionalInterceptorを台無しにしていました。 Default Interceptor Selectorを削除すると、トランザクションが開始されました。

+0

私は無駄にこれを試してみました。提案していただきありがとうございます。 –

+0

私たちの両方が同じコードを踏んでいたことは面白いです。私は登録の順序が問題かどうか疑問に思っていました。それは明らかです。これを見て、将来の開発者のために、登録のためだけでなく、正しく実装インターセプタセレクタの両方をチェック:) – SwampyFox

0

は、それはあなたの問題を解決しない場合は、その後も、送信、AutoTxとNHibFacの3.0.xののnugetを試し、SwampyFoxの提案を試してみてください。新しい開発(バグの場合)がそれらに入り込んでいます。 TellはFoxyの提案を試した結果です。

+0

下記答えてご覧ください。乾杯。それはすでにv3では計画だ - 私が行う必要がある何 –

関連する問題