2010-12-15 60 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>