在WCF项目中启动NHibernate的简单方法

在WCF项目中启动NHibernate的简单方法,wcf,nhibernate,wcf-configuration,Wcf,Nhibernate,Wcf Configuration,我想在我的WCF项目中使用NHibernate启动模块,就像我在ASP.NET MVC项目中使用的模块一样。Jeffery Palermo概述了我在他的帖子中使用的启动模块。基本上,代码归结为在web.config中添加如下所示的启动模块: <system.webServer> <modules runAllManagedModulesForAllRequests="true"> <add name="StartupModule" type="In

我想在我的WCF项目中使用NHibernate启动模块,就像我在ASP.NET MVC项目中使用的模块一样。Jeffery Palermo概述了我在他的帖子中使用的启动模块。基本上,代码归结为在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项目中NHibernate的简单启动机制,我有哪些选择?

您可以使用。在您的NHibernateModule工具上。这将允许您在收到每个请求时打开NHibernate会话,并在发送回复之前关闭会话

巴勒莫的演示表明您将扩展IHttpModule。如果是这种情况,您将为IDispatchMessageInspector接口添加两个方法:

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

这将使用旧代码实现新接口。您还需要实现该接口。这将允许您在web.config中的行为扩展上使用该模块。IServiceBehavior需要三种方法,但实际上只有一种方法可以执行任何操作:

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应返回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>

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