Quartz.Net依赖注入.Net核心
在我的项目中,我必须使用Quartz,但我不知道我做错了什么。
In my project I have to use Quartz but I don't know what i do wrong.
JobFactory:
JobFactory:
public class IoCJobFactory : IJobFactory
{
private readonly IServiceProvider _factory;
public IoCJobFactory(IServiceProvider factory)
{
_factory = factory;
}
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return _factory.GetService(bundle.JobDetail.JobType) as IJob;
}
public void ReturnJob(IJob job)
{
var disposable = job as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}
}
QuartzExtensions:
QuartzExtensions:
public static class QuartzExtensions
{
public static void UseQuartz(this IApplicationBuilder app)
{
app.ApplicationServices.GetService<IScheduler>();
}
public static async void AddQuartz(this IServiceCollection services)
{
var props = new NameValueCollection
{
{"quartz.serializer.type", "json"}
};
var factory = new StdSchedulerFactory(props);
var scheduler = await factory.GetScheduler();
var jobFactory = new IoCJobFactory(services.BuildServiceProvider());
scheduler.JobFactory = jobFactory;
await scheduler.Start();
services.AddSingleton(scheduler);
}
}
当我尝试运行我的Job时(类具有依赖性我总是得到异常,因为:
And when I try run my Job (class have dependency injection) i always get Exception becouse:
_factory.GetService(bundle.JobDetail.JobType) as IJob;
始终为空。
我的课程实现 IJob
并在startup.cs中添加:
My class implement IJob
and in startup.cs I add:
services.AddScoped<IJob, HelloJob>();
services.AddQuartz();
和
app.UseQuartz();
我使用标准.net核心依赖项注入:
I using standard .net Core dependency injection:
using Microsoft.Extensions.DependencyInjection;
这就是我在应用程序中所做的事情。而不是将调度程序添加到ioc中,我只添加了工厂
This is how I did it in my application. Instead of adding the Scheduler to the ioc I only add the factory
services.AddTransient<IJobFactory, AspJobFactory>(
(provider) =>
{
return new AspJobFactory( provider );
} );
我的工作工厂看起来差不多。瞬态并不重要,因为我还是只使用一次。然后,我的使用Quartz扩展方法是
My job factory pretty much looks the same. Transient does not really matter as I only use this once anyway. My use Quartz extension method then is
public static void UseQuartz(this IApplicationBuilder app, Action<Quartz> configuration)
{
// Job Factory through IOC container
var jobFactory = (IJobFactory)app.ApplicationServices.GetService( typeof( IJobFactory ) );
// Set job factory
Quartz.Instance.UseJobFactory( jobFactory );
// Run configuration
configuration.Invoke( Quartz.Instance );
// Run Quartz
Quartz.Start();
}
石英
类也是Singleton。
The Quartz
class is Singleton as well.