2

在调用使用 DI 注入的 dbcontext(瞬态作用域)的方法期间,我收到“无法访问已处置的对象”异常——很可能在调用时已处置 dbcontext。该方法正在由流利的调度程序作为作业调用:

JobManager.AddJob(
   () => ExecuteUpdateDbContext(),
   (s) => s.ToRunNow().AndEvery(60).Minutes()
);

ExecuteUpdateDbContext 方法在任何情况下都可以工作,除非由 fluent 调度程序使用。我是否需要对我的 ExecuteUpdateDbContext 方法做一些特别的事情才能使它与流利的调度程序一起工作?

4

1 回答 1

3

我在使用流畅的调度程序或其他同步功能时遇到了同样的问题。为此,我创建了一个ServiceScopeFactory对象并将其注入注册表的构造函数中。

我在 startup.cs 的 Configure() 函数中初始化了我的作业管理器-

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    IServiceScopeFactory serviceScopeFactory = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>();
    JobManager.Initialize(new SchedulerRegistry(serviceScopeFactory));
}

调度程序注册表 -

public SchedulerRegistry(IServiceScopeFactory serviceScopeFactory)
        {
Schedule(() => new SyncUpJob(serviceScopeFactory)).ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0);
}

SyncupJob -

public class SyncUpJob : IJob
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="migrationBusiness"></param>
    public SyncUpJob (IServiceScopeFactory serviceScopeFactory)
    {
        this.serviceScopeFactory = serviceScopeFactory;
    }

    private IServiceScopeFactory serviceScopeFactory;

    /// <summary>
    /// 
    /// </summary>
    public void Execute()
    {
        // call the method to run weekly 
        using (var serviceScope = serviceScopeFactory.CreateScope())
        {
            IMigrationBusiness migrationBusiness = serviceScope.ServiceProvider.GetService<IMigrationBusiness>();
            migrationBusiness.SyncWithMasterData();
        }
    }
}
于 2018-07-04T06:26:49.283 回答