2010-12-15 8 views
5

ASP.NET MVCプロジェクトに使用するWCFプロジェクト用のNHibernateスタートアップモジュールを使用したいと思います。 Jeffery Palermoは私が彼の投稿ASP.NET MVC HttpModule Registrationで使っている起動モジュールの概要を説明します。基本的に、コードは次のようになりますweb.configファイル内のスタートアップモジュールを追加することに沸く:WCFプロジェクトでNHibernateを簡単に起動する方法

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="StartupModule" type="Infrastructure.NHibernateModule, Infrastructure, Version=1.0.0.0, Culture=neutral" /> 
    </modules> 
    </system.webServer> 

私はSoapUIとエンドポイントに対するWCF Test Clientまたは直接にサービスを実行しようとすると、これが機能していません。 WCFプロジェクトにおけるNHibernateの簡単な起動メカニズムに対する私のオプションは何ですか?

答えて

6

ためISessionFactory管理はあなたがMessage Inspectorを使用して問題を解決することができ、ISessionのSharp Architectures実装を見ることができます。 NHibernateModuleではIDispatchMessageInspectorを実装します。これにより、各リクエストが受信されるたびにNHibernateセッションを開き、返信が送信される直前に閉じることができます。

パレルモのデモは、IHttpModuleを拡張することを示しています。そのような場合は、IDispatchMessageInspectorインタフェースのための2つのメソッドを追加します。

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
{ 
    context_BeginRequest(null, null); 
    return null; 
} 

public void BeforeSendReply(ref Message reply, object correlationState) 
{ 
    context_EndRequest(null, null); 
} 

この

はあなたの古いコードを使用して新しいインターフェイスを実装します。また、 IServiceBehaviorインターフェイスを実装する必要があります。これにより、web.configのビヘイビア拡張モジュールでモジュールを使用することができます。

public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
{ 
    foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers) 
    { 
     foreach (EndpointDispatcher ed in cd.Endpoints) 
     { 
      ed.DispatchRuntime.MessageInspectors.Add(this); 
     } 
    } 
} 

このエンドポイントのそれぞれに新しいインスペクターを追加します。IServiceBehaviorは3つのメソッドを必要とし、一方のみが実際に何でもします。

BehaviorExtensionElementを追加する必要があります。このBehaviorExtensionElementは、NHibernateModuleの型と新しいインスタンスを返さなければなりません。これにより、web.config内のNHibernateModuleを返す新しい動作を作成することができます。

public class NHibernateWcfBehaviorExtension : BehaviorExtensionElement 
{ 
    public override Type BehaviorType 
    { 
     get { return typeof(NHibernateModule); } 
    } 

    protected override object CreateBehavior() 
    { 
     return new NHibernateModule(); 
    } 
} 

これですべての要素が順番に並んでいます。これをweb.configで使用できます。それらをすべてのサービスに適用するには、web.configは次のようになります。

<system.serviceModel> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior> 
     <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
     <serviceMetadata httpGetEnabled="true"/> 
     <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     <NHibernateSessionStarter /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <extensions> 
    <behaviorExtensions> 
     <add name="NHibernateSessionStarter" type="Infrastructure.NHibernateWcfBehaviorExtension, Infrastructure, Version=1.0.0.0, Culture=neutral" /> 
    </behaviorExtensions> 
    </extensions> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 
0

あなたはWCF

関連する問題