NServiceBus 5.2.9 エンドポイントがあり、NServiceBus を介して DBContext インスタンスを注入しています。
構成:
public class ConfigureDependencyInjection : INeedInitialization
{
public void Customize( BusConfiguration configuration )
{
configuration.RegisterComponents( reg =>
{
reg.ConfigureComponent<MyContext>( DependencyLifecycle.InstancePerUnitOfWork );
} );
}
}
これはサービスのコンストラクターです。
public NotificationService( IBus bus, IMyContext context )
{
this.bus = bus;
this.context = context;
}
コンテキスト フィールドにアクセスしようとすると、EntityException が発生します。
例外がスローされました: NServiceBus.Core.dll の 'System.Data.Entity.Core.EntityException' 追加情報: 基になるプロバイダーが Open で失敗しました。
なぜこうなった?
これに対する正しい有効期間が何であるかはわかりません。ですかDependencyLifecycle.InstancePerUnitOfWork
?DBContext は UOW コンストラクトですが、NServiceBus と同じかどうかはわかりません。
このエンドポイントに着信するメッセージは常に 1 つの (トランスポート) メッセージであるため、これは InstancePerUnitOfWork スコープの使用に正しく適用されます。
コンテキスト インスタンスはクラス内で共有されるため、アクセスするたびに次のように syncLock に対してロックします。
lock ( syncLock )
{
log.Info( "Get customers..." );
var result = from c in context.Customers
...
select...;
}
スレッドセーフを念頭に置きながら、DBContext を正しく使用するにはどうすればよいですか?
どうもありがとう。
編集: 接続文字列/構成は問題ありません。app.config および/または web.config ごとに構成されているように、同じコンテキストを同じ場所の多くの場所で使用しています。