Puede resolver el problema mediante el uso de un Message Inspector. En su NHibernateModule, implemente IDispatchMessageInspector. Esto le permitirá abrir su sesión de NHibernate a medida que se reciba cada solicitud y cerrarla justo antes de que se envíe su respuesta.
La demostración de Palermo indica que habrá extendido IHttpModule. Si ese es el caso, se le agrega dos métodos para la interfaz IDispatchMessageInspector:
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
context_BeginRequest(null, null);
return null;
}
y
public void BeforeSendReply(ref Message reply, object correlationState)
{
context_EndRequest(null, null);
}
Esto pondrá en marcha la nueva interfaz usando el código antiguo. También necesitará implementar la interfaz IServiceBehavior. Esto le permitirá usar el módulo en una extensión de comportamiento en su web.config. El IServiceBehavior requiere tres métodos, sólo uno realmente va a hacer nada:
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
{
foreach (EndpointDispatcher ed in cd.Endpoints)
{
ed.DispatchRuntime.MessageInspectors.Add(this);
}
}
}
Esto agregará su nuevo inspector para cada uno de los puntos finales.
A continuación, tendrá que agregar un BehaviorExtensionElement. Este BehaviorExtensionElement debe devolver el tipo y una nueva instancia de su NHibernateModule. Esto le permitirá crear un nuevo comportamiento que devuelva el NHibernateModule en su web.config.
public class NHibernateWcfBehaviorExtension : BehaviorExtensionElement
{
public override Type BehaviorType
{
get { return typeof(NHibernateModule); }
}
protected override object CreateBehavior()
{
return new NHibernateModule();
}
}
Ahora que tiene todas las piezas en orden, puede usarlas en su web.config. Para aplicarlos a todos los servicios, su web.config debería verse de la siguiente manera.
<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>