Search code examples
c#.netautofacquartz.net

The requested service ' has not been registered in Quartz.net using autofac


I am using autofac to register Quartz but I am running into a problem I get this:

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.

when the NewJob method gets invoken inside the jobFactory :IjobFactory class.

the 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) { }
    }
}

the Autofac startup class:

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();

        }
    }

}

main class which is calling the install and also instantiating the JobFactory I am passing the container which I get from the startup class with all the dependencies to 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();

            }
        }
    }
}

Any help would be appreciated been stuck on this for too long


Solution

  • 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.

    This error message indicates that ConsumerSchechulerJob has not been registered. If you look at your registration

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

    You register ConsumerSchechulerJob as IJob but not as ConsumerSchechulerJob so Autofac doesn't have any registration for ConsumerSchechulerJob. To fix this you should register it.

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

    or

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