5

ASP.NET MVC プロジェクトに使用するような NHibernate スタートアップ モジュールを WCF プロジェクトに使用したいと考えています。Jeffery Palermo は、投稿ASP.NET MVC HttpModule Registrationで私が使用するスタートアップ モジュールの概要を説明しています。基本的に、コードは次のように web.config にスタートアップ モジュールを追加することになります。

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

これは、WCF テスト クライアントを使用してサービスを実行しようとしたとき、またはSoapUIを使用してエンドポイントに対して直接実行しようとしたときに機能しません。WCF プロジェクトでの NHibernate の単純な起動メカニズムのオプションは何ですか?

4

1 に答える 1

6

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

Palermo のデモは、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 の動作拡張でモジュールを使用できるようになります。IServiceBehavior には 3 つのメソッドが必要ですが、実際に何かを行うのは 1 つだけです。

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

これにより、新しいインスペクターが各エンドポイントに追加されます。

次に、 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>
于 2010-12-16T22:37:09.063 に答える