gpt4 book ai didi

asp.net-mvc-3 - 如何创建需要使用 autofac 进行注入(inject)的 Quartz.NET 作业

转载 作者:行者123 更新时间:2023-12-03 00:29:39 24 4
gpt4 key购买 nike

我正在尝试让 Quartz.net (2.1.2) 与 IoC 容器 (autofac) 一起使用,因为我有需要在计划作业中使用的服务。我发现了有关该主题的类似帖子,但我似乎找不到包含 autofac 的特定注册示例的帖子。

以下帖子处理了我遇到的相同问题:

How to schedule task using Quartz.net 2.0?

但是,我认为我缺少的部分是当答案说“并且不要忘记在 IoC 容器中注册作业”时。我不确定如何准确执行此操作,因为到目前为止我尝试过的所有方法都不起作用。

在下面的示例中,“HelloJob”将运行,但每当我尝试将releaseService注入(inject)“ReleaseJob”时,它都拒绝运行。

更新:我在 DependencyRegistration.cs 部分标记了我认为存在问题的代码。

更新 2:一些与我需要做的事情相关的相关链接可能会有所帮助(我已经浏览了所有这些链接,但仍然无法弄清楚如何使用 autofac 来实现这一点):

如何以 PRO 方式使用 Quartz.NET?- http://blog.goyello.com/2009/09/21/how-to-use-quartz-net-in-pro-way/

Autofac 和 Quartz.NET- http://blog.humann.info/post/2013/01/30/Autofac-and-QuartzNET.aspx

使用 Quartz.NET 和简单注入(inject)器进行构造函数注入(inject)- Constructor injection with Quartz.NET and Simple Injector

ASP.Net MVC 3、Ninject 和 Quartz.Net - 如何操作?- ASP.Net MVC 3, Ninject and Quartz.Net - How to?

相关代码如下:

Global.asax

    protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();

RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);

var dependencyRegistration = new DependencyRegistration();
dependencyRegistration.Register();

ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(new ValidatorFactory()));

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
}

DependencyRegistration.cs

public class DependencyRegistration
{
public void Register()
{
var builder = new ContainerBuilder();

builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly());

// Validation
builder.RegisterType<ValidatorFactory>()
.As<IValidatorFactory>()
.InstancePerHttpRequest();

AssemblyScanner findValidatorsInAssembly = AssemblyScanner.FindValidatorsInAssembly(Assembly.GetExecutingAssembly());
foreach (AssemblyScanner.AssemblyScanResult item in findValidatorsInAssembly)
{
builder.RegisterType(item.ValidatorType)
.As(item.InterfaceType)
.InstancePerHttpRequest();
}

// Schedule
builder.Register(x => new StdSchedulerFactory().GetScheduler()).As<IScheduler>();

// Schedule jobs
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).Where(x => typeof(IJob).IsAssignableFrom(x));

var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

//Schedule
IScheduler sched = container.Resolve<IScheduler>();
sched.JobFactory = new AutofacJobFactory(container);
sched.Start();

IJobDetail job = JobBuilder.Create<ReleaseJob>()
.WithIdentity("1Job")
.Build();

ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("1JobTrigger")
.WithSimpleSchedule(x => x
.RepeatForever()
.WithIntervalInSeconds(5)
)
.StartNow()
.Build();

sched.ScheduleJob(job, trigger);

job = JobBuilder.Create<HelloJob>()
.WithIdentity("2Job")
.Build();

trigger = TriggerBuilder.Create()
.WithIdentity("2JobTrigger")
.WithSimpleSchedule(x => x
.RepeatForever()
.WithIntervalInSeconds(5)
)
.StartNow()
.Build();

sched.ScheduleJob(job, trigger);
}
}

JobFactory.cs

public class AutofacJobFactory : IJobFactory
{
private readonly IContainer _container;

public AutofacJobFactory(IContainer container)
{
_container = container;
}

public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return (IJob)_container.Resolve(bundle.JobDetail.JobType);
}

public void ReturnJob(IJob job)
{
}
}

ReleaseJob.cs

public class ReleaseJob : IJob
{
private readonly IReleaseService _releaseService;

public ReleaseJob(IReleaseService releaseService)
{
this._releaseService = releaseService;
}

public void Execute(IJobExecutionContext context)
{
Debug.WriteLine("Release running at " + DateTime.Now.ToString());
}
}

public class HelloJob : IJob
{
public void Execute(IJobExecutionContext context)
{
Debug.WriteLine("Hello job at " + DateTime.Now.ToString());
}
}

ReleaseServiceModel.cs

public class ReleaseServiceModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<ReleaseService>()
.As<IReleaseService>()
.InstancePerLifetimeScope();
}
}

最佳答案

我终于找到问题所在了。

我的发布服务使用的是在不同范围内创建的数据存储库。

我通过创建一个新的测试服务发现了这一点,该服务除了返回一个字符串之外什么也不做,并且可以将其注入(inject)到 quartz 作业中。

发现这一点后,我更改了发布服务调用的存储库的范围,然后发布服务开始在quartz作业中工作。

对于任何看到这个问题并试图帮助我的人,我深表歉意。由于没有列出发布服务的代码,因此很难找出问题所在。

我已经用 autofac 用于quartz 的最终工作绑定(bind)更新了代码。

关于asp.net-mvc-3 - 如何创建需要使用 autofac 进行注入(inject)的 Quartz.NET 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16908342/

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