2010-12-15 44 views
5

Chciałbym użyć modułu startowego NHibernate dla mojego projektu WCF, jak ten, którego używam na moich projektach ASP.NET MVC. Jeffery Palermo przedstawia moduł uruchamiania, którego używam w jego poście: ASP.NET MVC HttpModule Registration. Zasadniczo sprowadza się do kodu, dodając moduł startowy w pliku web.config, który wygląda tak:Łatwy sposób uruchomieniem NHibernate w projekcie WCF

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="StartupModule" type="Infrastructure.NHibernateModule, Infrastructure, Version=1.0.0.0, Culture=neutral" /> 
    </modules> 
    </system.webServer> 

ta nie działa, gdy próbuję uruchomić usługę z WCF Test Client lub bezpośrednio przed końcowym z SoapUI. Jakie są moje opcje prostego mechanizmu uruchamiania dla NHibernate w projekcie WCF?

Odpowiedz

6

Można rozwiązać ten problem za pomocą Message Inspector. Na Twoim urządzeniu NHibernateModule IDispatchMessageInspector. Umożliwi to otwarcie sesji NHibernate po otrzymaniu każdego żądania i zamknięcie go tuż przed wysłaniem odpowiedzi.

demo Palermo oznacza, że ​​trzeba będzie rozszerzyć IHttpModule. Jeśli tak jest, należy dodać dwie metody interfejsu IDispatchMessageInspector:

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

i

public void BeforeSendReply(ref Message reply, object correlationState) 
{ 
    context_EndRequest(null, null); 
} 

ta będzie stanowić nowy interfejs za pomocą starego kodu. Konieczne będzie również wdrożenie interfejsu IServiceBehavior. Umożliwi to korzystanie z modułu w rozszerzeniu zachowania w pliku web.config. IServiceBehavior wymaga trzech metod, tylko jeden będzie właściwie nic:

public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
{ 
    foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers) 
    { 
     foreach (EndpointDispatcher ed in cd.Endpoints) 
     { 
      ed.DispatchRuntime.MessageInspectors.Add(this); 
     } 
    } 
} 

Spowoduje to dodanie nowego inspektora do każdego z punktów końcowych.

Będziesz wtedy musiał dodać BehaviorExtensionElement. To BehaviorExtensionElement powinno zwrócić typ i nową instancję swojego NHibernateModule. To pozwoli ci stworzyć nowe zachowanie, które zwróci NHibernateModule w twoim web.config.

public class NHibernateWcfBehaviorExtension : BehaviorExtensionElement 
{ 
    public override Type BehaviorType 
    { 
     get { return typeof(NHibernateModule); } 
    } 

    protected override object CreateBehavior() 
    { 
     return new NHibernateModule(); 
    } 
} 

Teraz masz wszystkie elementy w porządku, możesz ich użyć w swoim web.config. Aby zastosować je do wszystkich usług, twój plik web.config powinien wyglądać jak poniżej.

<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> 
Powiązane problemy