Quartz.Net依赖注入.Net核心 [英] Quartz.Net Dependency Injection .Net Core

查看:749
本文介绍了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.

这篇关于Quartz.Net依赖注入.Net核心的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆