c# - Hangfire 中的 JobActivator 不会为 RecurringJob 的每次运行实例化 DataContext
问题描述
我正在使用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 似乎已被“缓存”。因为当我使用
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())
推荐阅读
- json - Flutter:如何将字符串转换为地图
在json中 - collections - Mapstruct:将集合映射到对象
- c# - 为什么 staticpropertychanged 为空?
- sql - 基于 2 列 PostgreSQL 创建序列
- function - 在 Kotlin 中显示不同行为的块体和表达式体函数
- android - 以编程方式在 Android 中的 ImageView 内的 VectorDrawable 上应用渐变
- c# - Hangman - 当我输入错误的字母时,出现消息系统索引超出范围
- typescript - 任务模块获取和提交在打字稿机器人 SDK4 中不起作用
- java - 迭代列表映射并将值插入到另一个包含先前列表值的自定义列表的映射。可能吗?
- python - python:导航一个 4-D numpy 数组