WCFプロジェクトでNhibernateを起動する簡単な方法
-
10-10-2019 - |
質問
ASP.NET MVCプロジェクトに使用しているように、WCFプロジェクトにNhibernate Startup Moduleを使用したいと思います。 Jeffery Palermoは、私が彼の投稿で使用しているスタートアップモジュールの概要を示しています ASP.NET MVC HTTPMODULE登録. 。基本的に、コードは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テストクライアント または、エンドポイントに対して直接 ソープイ. 。 WCFプロジェクトにおけるNhibernateの簡単なスタートアップメカニズムの私の選択肢は何ですか?
解決
aを使用して問題を解決できます メッセージインスペクター. 。 nhibernatemodule実装で IdisPatchMessageInspector. 。これにより、各リクエストが受信され、返信が送信される直前に閉鎖されるため、Nhibernateセッションを開くことができます。
パレルモのデモは、ihttpmoduleを拡張したことを示しています。その場合、IdisPatchMessageInspectorインターフェイスに2つの方法を追加します。
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には3つの方法が必要であり、実際には何でもする方法は1つだけです。
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
{
foreach (EndpointDispatcher ed in cd.Endpoints)
{
ed.DispatchRuntime.MessageInspectors.Add(this);
}
}
}
これにより、新しいインスペクターが各エンドポイントに追加されます。
その後、aを追加する必要があります BehaviorExtensionElement. 。このbehavioorextenselementは、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>