所请求的服务尚未使用autofac在Quartz.net中注册

时间:2020-01-23 18:00:50

标签: c# .net autofac quartz-scheduler quartz.net

我正在使用autofac来注册Quartz,但是遇到一个问题:

The requested service 'AuthMatcher.ConsumerSchechuler.ConsumerSchechulerJob' has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.

在jobFactory:IjobFactory类中调用NewJob方法时。

FactoryClass:

    using Autofac;
using Microsoft.Extensions.DependencyInjection;
using Quartz;
using Quartz.Spi;
using System;

namespace AuthMatcher.ConsumerSchechuler
{
    public class ConsumerJobFactory : IJobFactory
    {
        private IScheduler _scheduler;
        private readonly IContainer _container;
        public ConsumerJobFactory(IContainer container)
        {
            _container = container;
        }

        public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
        {
            //test to see what happenes, it returns null
            var service =  _container.ResolveOptional<ConsumerSchechulerJob>();
          // this is where the exception happens
            return (IJob)_container.Resolve(bundle.JobDetail.JobType);
        }

        public void ReturnJob(IJob job) { }
    }
}

Autofac启动类:

namespace Workers
{
    public class InstallerClass
    {
        private static readonly ILogger Logger = LogManager.GetCurrentClassLogger();

        public static IContainer Startup()
        {
            var builder = new ContainerBuilder();
            builder.RegisterType<Application>().As<IApplication>();
            builder.RegisterType<RabbitMQImpl>().As<IQueue>().SingleInstance();
            builder.RegisterType<ConsumeSchechuler>().As<IConsumeSchechuler>();
            builder.RegisterType<BotFactory>().As<IBotFactory>();
            var instance = QuartzInstance.Instance;
            builder.RegisterType<ConsumerSchechulerJob>().As<IJob>();
            builder.RegisterInstance(QuartzInstance.Instance).As<IScheduler>();

            return builder.Build();

        }
    }

}

主类,它调用安装并实例化JobFactory 我正在将从启动类获得的具有所有依赖关系的容器传递给ConsumerJobFactory。

namespace Workers
{
    class Program
    {
        static void Main(string[] args)
        {

            var container = InstallerClass.Startup();
            using (var scope = container.BeginLifetimeScope())
            {

                var app = scope.Resolve<IApplication>();
                var _scheduler = container.Resolve<IScheduler>();
                _scheduler.JobFactory = new ConsumerJobFactory(container);
                app.Run();

            }
        }
    }
}

任何帮助在此停留太长时间都会感激

1 个答案:

答案 0 :(得分:0)

请求的服务AuthMatcher.ConsumerSchechuler.ConsumerSchechulerJob尚未注册。为避免此异常,请注册一个组件以提供服务,或者使用IsRegistered()检查服务注册,或者使用ResolveOptional()方法解决可选的依赖项。

此错误消息表明尚未注册ConsumerSchechulerJob。如果您查看自己的注册

 builder.RegisterType<ConsumerSchechulerJob>().As<IJob>();

您将ConsumerSchechulerJob注册为IJob,但没有注册为ConsumerSchechulerJob,因此Autofac没有为ConsumerSchechulerJob注册任何注册。要解决此问题,您应该注册它。

 builder.RegisterType<ConsumerSchechulerJob>()
        .As<IJob>()
        .As<ConsumerSchechulerJob>();

 builder.RegisterType<ConsumerSchechulerJob>()
        .As<IJob>()
        .AsSelf();
相关问题