2010-12-15 62 views
5

我想为我的WCF项目使用NHibernate启动模块,就像我用于我的ASP.NET MVC项目一样。 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

您可以通过使用Message Inspector解决问题。在你的NHibernateModule实现IDispatchMessageInspector。这将允许您在收到每个请求时打开NHibernate会话,并在发送回复之前关闭它。

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

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接口需要三种方法中,只有一个会怎么做任何事情:

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>