gpt4 book ai didi

c# - 使用 Quartz.NET 3.0.3 和简单注入(inject)器如何进行构造函数注入(inject)

转载 作者:行者123 更新时间:2023-11-30 15:16:35 25 4
gpt4 key购买 nike

我正在尝试在 Windows 服务中使用 Quartz.Net v3.0.3 和 Simple Injector。

我有一个作业类,我想在其中注入(inject)一些依赖项,例如我的记录器。

public class JobWorker :  IJob
{
private ILogger _logger;

public JobWorker(ILogger logger)
{
_logger = logger;
}

public Task Execute(IJobExecutionContext context)
{
return Task.Run(() =>_logger.Log("Do Work"));
}
}

我尝试在我的 DI 层上注册 Container.Register<IJob, JobWorker>(); 但这没有帮助。

如果我删除注入(inject)的依赖项并简单地使用默认的无参数构造函数,作业就会正确触发。

根据史蒂文下面的帖子,建议是创建一个工厂,但是提供的答案在新框架的上下文中已经过时,我完全不知道如何将依赖项注入(inject)作业。

Constructor injection with Quartz.NET and Simple Injector

最佳答案

@Rabban 提供的链接仍然有效,使用 IServiceProvider 是一个不错的设计选择,但您可以使用任何您想要的具体容器。

这是我的 2c,基于 Rabban 使用 Quartz 3.0.4SimpleInjector 4.2.1 的回答:

using NLog;
using Quartz;
using Quartz.Spi;
using System;

namespace My.Dear.App.Infrastructure
{

public class SomeJobFactory : IJobFactory
{
private static ILogger logger = LogManager.GetCurrentClassLogger();
private readonly IServiceProvider serviceProvider;

public DexJobFactory(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}

public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
try
{
IJobDetail jobDetail = bundle.JobDetail;
Type jobType = jobDetail.JobType;
logger.Debug($"Producing instance of Job '{jobDetail.Key}', class={jobType.FullName}");

return serviceProvider.GetService(jobType) as IJob;
}
catch (Exception ex)
{
logger.Error(ex, Constants.ErrorAt, nameof(IJobFactory.NewJob));
throw new SchedulerException($"Problem instantiating class '{bundle.JobDetail.JobType.FullName}'", ex);
}
}

public void ReturnJob(IJob job)
{
var disposable = job as IDisposable;
disposable?.Dispose();
}
}
}

对我来说就像一个魅力。

如何获取实例?

public static async Task RegisterQuartz(Container container)
{
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = await schedulerFactory.GetScheduler();
IJobFactory jobFactory = new SomeJobFactory(container);
scheduler.JobFactory = jobFactory;

container.RegisterInstance(schedulerFactory);
container.RegisterInstance(jobFactory);
container.RegisterInstance(scheduler);
container.Register<IDearJob, DearJob>();
}

哦,别忘了注册您的职位。否则可能无法正常工作。

我建议为每个作业创建一个接口(interface),而不是为此使用 Quartz IJob

public interface IDearJob : IJob { }

public interface DearJob : IDearJob
{
private readonly ISomeService service;

public DearJob(ISomeService service)
{
this.service = service;
}

public async Task Execute(IJobExecutionContext context)
{
// retrieve context if you need
await this.service.DoSomethingAsync(/*params*/);
}
}

现在您可以在 Execute 上使用断点。干杯。

编辑

P.S.:Steven 的回答非常好,我认为您可以使用它来更新您的上下文。现在严肃点,干杯。

关于c# - 使用 Quartz.NET 3.0.3 和简单注入(inject)器如何进行构造函数注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49057860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com