簡體   English   中英

所請求的服務 ' 尚未使用 autofac 在 Quartz.net 中注冊

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

我正在使用 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 方法時。

工廠類:

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

            }
        }
    }
}

任何幫助將不勝感激

請求的服務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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM