2010-12-15 1 views
5

Я бы хотел использовать модуль запуска NHibernate для моего проекта WCF, как тот, который я использую для своих проектов ASP.NET MVC. Джеффри Палермо описывает модуль запуска, который я использую в своем посте ASP.NET MVC HttpModule Registration. По существу код сводится к добавлению модуля запуска в web.config, который выглядит следующим образом:Простой способ запуска NHibernate в проекте WCF

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

Это не работает, когда я пытаюсь запустить службу с WCF Test Client или непосредственно против конечной точки с SoapUI. Каковы мои варианты простого механизма запуска для NHibernate в проекте WCF?

ответ

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. Это позволит вам создать новое поведение, которое возвращает NHibernateModule в вашем web.config.

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>