ため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>