1

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 ごとに構成されているように、同じコンテキストを同じ場所の多くの場所で使用しています。

4

0 に答える 0