Простой способ запуска NHibernate в проекте WCF - PullRequest
5 голосов
/ 16 декабря 2010

Я бы хотел использовать модуль запуска NHibernate для моего проекта WCF, такой как тот, который я использую для своих проектов ASP.NET MVC.Джеффри Палермо описывает модуль запуска, который я использую в своем сообщении Регистрация HttpModule для ASP.NET MVC .По сути, код сводится к добавлению загрузочного модуля в 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 Test Client или непосредственно к конечной точке с помощью SoapUI .Какие у меня варианты для простого механизма запуска NHibernate в проекте WCF?

1 Ответ

6 голосов
/ 17 декабря 2010

Вы можете решить проблему с помощью Инспектора сообщений .На вашем 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>
...