我有一个 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 配置的那样。