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”附加信息:底层提供程序在打开时失败。

为什么会这样?

我不确定正确的生命周期范围是什么。是DependencyLifecycle.InstancePerUnitOfWork吗?DBContext 是一个 UOW 构造,但我不确定它是否与 NServiceBus 相同。

进入此端点的消息始终是 ONE(传输)消息,因此这应该正确适用于使用 InstancePerUnitOfWork 范围。

上下文实例在类中共享,因此每次访问它时,我都会像这样锁定一个 syncLock:

lock ( syncLock )
{
    log.Info( "Get customers..." );

    var result = from c in context.Customers
    ...
    select...;
}

我将如何正确使用 DBContext,同时牢记线程安全?

太感谢了。

编辑: 连接字符串/配置没问题,我在许多地方都使用相同的上下文,正如根据 app.config 和/或 web.config 配置的那样。

4

0 回答 0