我使用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;
}然而,当我像下面这样在每分钟从DB检索数据时,我收到了错误的数据(项被其他应用程序更新到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?
发布于 2020-07-24 09:58:53
Hangfire的就业机会分享活化剂的实例。
因此我使用了Hangfire Autofac nuget - Hangfire.Autofac.
可以指定每个作业的依赖项具有实例。
containerBuilder.RegisterType<DataContext>().InstancePerBackgroundJob();然后在配置中
GlobalConfiguration.Configuration.UseAutofacActivator(containerBuilder.Build())https://stackoverflow.com/questions/62995440
复制相似问题