Hangfire 中的 JobActivator 不会为每个 运行 的 RecurringJob 实例化 DataContext
JobActivator in Hangfire doesnt instancelize DataContext for each run of RecurringJob
我正在使用 HangFire
和 EntityFramework
进行重复性工作
public void Start(IContainer container)
{
GlobalConfiguration.Configuration
.UseColouredConsoleLogProvider(LogLevel.Debug)
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseActivator(new MyActivator(container))
.UseRecommendedSerializerSettings();
RecurringJob.AddOrUpdate<EveryMinute>((x) => x.ExecuteAsync(), Cron.Minutely);
}
激活器:
public class MyActivator : JobActivator
{
private readonly IContainer _container;
public MyActivator (IContainer container)
{
_container = container;
}
public override object ActivateJob(Type type)
{
return _container.Resolve(type);
}
}
然后我 ctor
初始化 Datacontext
和 RepositoryA
public EveryMinute(DataContext dataContext,RepositoryA repositoryA)
{
_dataContext = dataContext;
_repositoryA = repositoryA;
}
然而,当我像下面这样每分钟从数据库中检索数据时,我收到了错误的数据(其他应用程序在 Hangfire 作业之外更新了项目)。
public async Task ExecuteAsync()
{
var dbItem = _dataContext.Items.Single(x => x.Id == 1);
//dbItem.StateProperty property is old
}
从作业创建(应用程序启动)开始,项目或 DataContext 似乎是 'cached'。因为当我使用
public EveryMinute()
{
_dataContext = new DataContext();
_repositoryA = new RepositoryA(_dataContext);
}
它工作正常。
我是不是用错激活器了?或者如何为每次依赖注入调用指定我需要新实例DataContext
?
Hangfire 中的作业共享激活器实例。
因此我使用了 Hangfire Autofac nuget - Hangfire.Autofac
.
您可以为每个作业指定依赖实例
containerBuilder.RegisterType<DataContext>().InstancePerBackgroundJob();
然后在配置中
GlobalConfiguration.Configuration.UseAutofacActivator(containerBuilder.Build())
我正在使用 HangFire
和 EntityFramework
进行重复性工作
public void Start(IContainer container)
{
GlobalConfiguration.Configuration
.UseColouredConsoleLogProvider(LogLevel.Debug)
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseActivator(new MyActivator(container))
.UseRecommendedSerializerSettings();
RecurringJob.AddOrUpdate<EveryMinute>((x) => x.ExecuteAsync(), Cron.Minutely);
}
激活器:
public class MyActivator : JobActivator
{
private readonly IContainer _container;
public MyActivator (IContainer container)
{
_container = container;
}
public override object ActivateJob(Type type)
{
return _container.Resolve(type);
}
}
然后我 ctor
初始化 Datacontext
和 RepositoryA
public EveryMinute(DataContext dataContext,RepositoryA repositoryA)
{
_dataContext = dataContext;
_repositoryA = repositoryA;
}
然而,当我像下面这样每分钟从数据库中检索数据时,我收到了错误的数据(其他应用程序在 Hangfire 作业之外更新了项目)。
public async Task ExecuteAsync()
{
var dbItem = _dataContext.Items.Single(x => x.Id == 1);
//dbItem.StateProperty property is old
}
从作业创建(应用程序启动)开始,项目或 DataContext 似乎是 'cached'。因为当我使用
public EveryMinute()
{
_dataContext = new DataContext();
_repositoryA = new RepositoryA(_dataContext);
}
它工作正常。
我是不是用错激活器了?或者如何为每次依赖注入调用指定我需要新实例DataContext
?
Hangfire 中的作业共享激活器实例。
因此我使用了 Hangfire Autofac nuget - Hangfire.Autofac
.
您可以为每个作业指定依赖实例
containerBuilder.RegisterType<DataContext>().InstancePerBackgroundJob();
然后在配置中
GlobalConfiguration.Configuration.UseAutofacActivator(containerBuilder.Build())