Я работаю с .NET 8 и Quartz 3.11, следуя официальной документации, и столкнулся с проблемой: я не могу правильно настроить внедрение зависимостей для задания, реализующего IJob. интерфейс. Например, MyExampleJob имеет конструктор с параметрами, которые необходимо внедрить, но это не так. Я тестировал с пустым конструктором, и он входит в пустой конструктор, но не в конструктор с зависимостями. Я настроил необходимые зависимости, но это не работает. Я также пробовал использовать x.UseMicrosoftDependencyInjectionJobFactory(), но этот метод станет устаревшим. Я прочитал несколько постов, но все они были опубликованы несколько лет назад.
public static async Task AddJobServices(this IServiceCollection services)
{
services.AddQuartz(q =>
{
q.UseMicrosoftDependencyInjectionJobFactory();
q.UseInMemoryStore();
q.UseDedicatedThreadPool(tp =>
{
tp.MaxConcurrency = 10;
});
q.AddJob(opts => opts
.WithIdentity(nameof(EventWithoutDrawReminderJob))
.StoreDurably()
.RequestRecovery());
});
services.AddQuartzHostedService(options =>
{
options.WaitForJobsToComplete = true;
options.AwaitApplicationStarted = true;
});
// Register jobs with DI
services.AddTransient();
var quartzProperties = new NameValueCollection
{
["quartz.serializer.type"] = "newtonsoft"
};
var factory = new StdSchedulerFactory(quartzProperties);
var list = await factory.GetAllSchedulers(); // Here it's a test an alternative but returns an empty list
var scheduler = await factory.GetScheduler();
scheduler.Start().Wait();
services.AddSingleton(scheduler);
return services;
}
Определение должности:
public class EventWithoutDrawReminderJob : IJob
{
public IApplicationDbContext DbContext { get; set; }
public INotificationService NotificationService { get; set; }
public UserManager UserManager { get; set; }
public RoleManager RoleManager { get; set; }
public ILogger Logger { get; set; }
// public EventWithoutDrawReminderJob()
// {
// Console.WriteLine(" > Starting JobExecution: EventWithoutDrawReminderJob"); // If I uncomment this line, the breakpoint stops here
// }
public EventWithoutDrawReminderJob(ApplicationDbContext dbContext,
INotificationService notificationService,
UserManager userManager,
RoleManager roleManager,
ILogger logger)
{
// This code never runs
DbContext = dbContext;
NotificationService = notificationService;
UserManager = userManager;
RoleManager = roleManager;
Logger = logger;
}
public async Task Execute(IJobExecutionContext context)
{
// My code using the dependencies
}
}
в program.cs
...
builder.Services.AddApplicationServices(appSettings);
await builder.Services.AddJobServices();
...
метод AddApplicationServices имеет:
public static IServiceCollection AddApplicationServices(this IServiceCollection services, IAppConfigurations appSettings)
{
services.AddDbContext(options =>
options.UseSqlServer(configuration.GetConnectionString("testDB"),
builder =>
{
builder.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName);
builder.EnableRetryOnFailure(3);
builder.CommandTimeout(30);
}
));
services.AddScoped(provider => provider.GetRequiredService());
// Configure Identity
services
.AddIdentityCore(options =>
{
options.Password.RequiredLength = 6;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireLowercase = false;
options.Password.RequireUppercase = false;
options.Password.RequireDigit = false;
})
.AddRoles()
.AddTokenProvider(TokenOptions.DefaultProvider)
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
services
.AddScoped()
.AddScoped();
services.AddScoped();
return services;
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... -with-net8