Quartz.Netdependencyinjection.NetCore在我的项目中,我必须使用Quartz,但我不知道我做错了什么。的JobFactory:publicclassIoCJobFactory:IJobFactory{privatereadonlyIServiceProvider_factory;公共IoCJobFactory(IServiceProvider工厂){_factory=工厂;}publicIJobNewJob(TriggerFiredBundlebundle,ISchedulerscheduler){return_factory.GetService(bundle.JobDetail.JobType)asIJob;}publicvoidReturnJob(IJobjob){vardisposable=jobasIDisposable;if(disposable!=null){disposable.Dispose();}}}QuartzExtensions:publicstaticclassQuartzExtensions{publicstaticvoidUseQuartz(thisIApplicationBuilderapp){app.ApplicationServices.GetService();}publicstaticasyncvoidAddQuartz(thisIServiceCollectionservices){varprops=newNameValueCollection{{"quartz.serializer.type","json"}};varfactory=newStdSchedulerFactory(props);varscheduler=awaitfactory.GetScheduler();varjobFactory=newIoCJobFactory(services.BuildServiceProvider());scheduler.JobFactory=jobFactory;等待scheduler.Start();services.AddSingleton(调度程序);当我尝试运行我的作业(类有依赖注入)时,我总是得到异常,因为:_factory.GetService(bundle.JobDetail.JobType)asIJob;对于我的ClassimplementsIJob和startup.csadd:services.AddScoped();总是空的服务.AddQuartz();和app.UseQuartz();我使用标准的.net核心依赖注入:使用Microsoft.Extensions.DependencyInjection;这就是我在申请中的做法。我没有将调度程序添加到ioc,而是添加工厂services.AddTransient((provider)=>{returnnewAspJobFactory(provider);});我的工作看起来几乎一样。瞬态无关紧要,因为我只使用它一次。我使用Quartz扩展方法publicstaticvoidUseQuartz(thisIApplicationBuilderapp,Actionconfiguration){//通过IOC容器的作业工厂varjobFactory=(IJobFactory)app.ApplicationServices.GetService(typeof(IJobFactory));//设置作业工厂Quartz.Instance.UseJobFactory(jobFactory);//运行配置configuration.Invoke(Quartz.Instance);//运行石英Quartz.Start();Quartz类也是一个单例。这只是解决IoC问题的解决方案的一个简单示例:JobFactory.cspublicclassJobFactory:IJobFactory{protectedreadonlyIServiceProviderContainer;公共JobFactory(IServiceProvider容器){容器=容器;}publicIJobNewJob(TriggerFiredBundlebundle,ISchedulerscheduler){returnContainer.GetService(bundle.JobDetail.JobType)asIJob;}publicvoidReturnJob(IJobjob){(jobasIDisposable)?.Dispose();}}Startup.cspublicvoidConfigure(IApplicationBuilderapp,IHostingEnvironmentenv,ILoggerFactoryloggerFactory,IApplicationLifetimelifetime,IServiceProvidercontainer){loggerFactory.AddConsole(Configuration.GetSection("Logging"));loggerFactory.AddDebug();app.UseMvc();//以下3行将QuartzStartup挂接到Web主机生命周期varquartz=newQuartzStartup(container);lifetime.ApplicationStarted.Register(quartz.Start);lifetime.ApplicationStopping.Register(quartz.Stop);}QuartzStartup.cs公共类QuartzStartup{私有teIScheduler_scheduler;//启动后,直到关闭完成,引用调度程序对象privatereadonlyIServiceProvidercontainer;publicQuartzStartup(IServiceProvidercontainer){this.container=container;}//启动调度程序,定义作业和触发器publicvoidStart(){if(_scheduler!=null){thrownewInvalidOperationException("Alreadystarted.");}varschedulerFactory=newStdSchedulerFactory();_scheduler=schedulerFactory.GetScheduler().Result;_scheduler.JobFactory=newJobFactory(容器);_scheduler.Start().Wait();varvoteJob=JobBuilder.Create().Build();varvoteJobTrigger=TriggerBuilder.Create().StartNow().WithSimpleSchedule(s=>s.WithIntervalInSeconds(60).RepeatForever()).Build();_scheduler.ScheduleJob(voteJob,voteJobTrigger).Wait();}//启动调度程序的关闭,并等待作业正常退出(在分配的超时内)publicvoidStop(){if(_scheduler==空){返回;}//给正在运行的作业30秒(例如)以正常停止if(_scheduler.Shutdown(waitForJobsToComplete:true).Wait(30000)){_scheduler=null;}else{//jobsdidn'texitintimelyfashion-logawarning...}}}考虑到你应该提前将服务注册到容器中(在我的例子中是VoteJob),我根据这个答案实现了这个。我希望它有所帮助。我遇到了同样的问题。我从services.AddScoped();更新了到services.AddScoped();然后它起作用了。_factory.GetService(bundle.JobDetail.JobType)作为IJob;不会为空:)以上就是C#学习教程的全部内容:Quartz.Net依赖注入.Net核心分享,如果对你有用需要了解更多C#学习教程,希望大家多多采纳多多关注吧——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
