2011-01-31 9 views
4

シングルコール動作のIISホストWCFサービスがあります。 データアクセスにFluent NHを使用し、次の問題に直面しました。 メソッド本体の中にNHセッションを閉じたり、処理したりすることはできません。なぜなら、シリアル化がゲームになると、遅延ロードされたフィールドにアクセスすることができないからです。 この質問NHibernate session management in WCF applicationの答えに記載されているアプローチを使用しようとしましたが、シリアライゼーションが始まる前にセッションの破棄も行われます。WCFを返した後のNHibernateセッションを閉じます

シリアル化の終了後にインスタンスコンテキストでコードを実行できるかどうか知りませんか?私も適切ソリューションに興味を持っています

おかげ

答えて

2

は、だから私は妥協し解決策を見つけました。 私は上記のリンクからIDispatchMessageInspector実装を使用していますが、別の方法で拡張機能のデタッチを実行します。ここ

は、元の実装

 public void BeforeSendReply(ref Message reply, object correlationState) 
     { 
      var extensions = OperationContext.Current.InstanceContext.Extensions.FindAll<UnitOfWorkContextExtension>(); 

      foreach (var extension in extensions) 
      { 
       OperationContext.Current.InstanceContext.Extensions.Remove(extension); 
      } 
     } 

からスニペット(それがシリアル化の前に起こるように)Iが空BeforeSendReplyメッセージを残しているが、代わりにAfterReceiveRequestの内部IはinstanceContext.Closingにsuscribeとイベントハンドラ

で拡張をデタッチ
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
     { 
      instanceContext.Extensions.Add(new UnitOfWorkContextExtension(ServiceLocator.IoC.Retrieve<IUnitOfWorkFactory>().Create())); 
      instanceContext.Closing += DetachExtension; 

      return null; 
     } 
+0

あなたは最高です。この答えを見つける前に、私は一日中同じ質問に苦しんでいました。 +1! – dvdvorle

0

(ロードされたオブジェクトの場合でも)NHibernate型がWCFシリアル化の問題を引き起こすため、オブジェクトグラフを再帰的に調べ、リフレクションの助けを借りてすべてのプロキシを実際のオブジェクトと基本.NETコレクションに置き換えます。このようにして、WCFメソッドによって返されるすべてのオブジェクトは、NHibernateへの参照のない単純なDTOです。

私は明示的にWCFメソッド内で次の操作を行います。

public Document GetDocumentById(int id) 
{ 
    using (var repository = GetRepository()) //Open ISession 
    { 
     var document = repository.GetDocumentById(id); 
     repository.DisconnectObject(document); //Replace proxies 
     return document; //Clean object 
    } //ISession.Dispose 
} 
関連する問題