Hangfire с автофаком в WebApi

У меня есть следующая конфигурация в startup.cs, но я получаю ошибку, хотя я установил Hangifre.Autofac пакет nuget и настроен.

Из области, в которой был запрошен экземпляр, не видна область с тегом, совпадающим с "AutofacWebRequest". Как правило, это указывает на то, что компонент, зарегистрированный как запрос на HTTP, запрашивается компонентом SingleInstance() (или аналогичным сценарием). При веб-интеграции всегда запрашивают зависимости из DependencyResolver.Current или ILifetimeScopeProvider.RequestLifetime, а не из самого контейнера.,

Startup.cs

 public void Configuration(IAppBuilder app)
        {

            var builder = new ContainerBuilder();


            //if (AppConfigHelper.PlatformEnvironment == PlatformEnvironment.LocalHost)
            builder.RegisterType<NLogLogger>().As<ILogger>().InstancePerLifetimeScope();
            //else
            //builder.RegisterType<SentryLogger>().As<ILogger>().InstancePerLifetimeScope();

            //builder.RegisterWebApiFilterProvider(configuration);

            // REGISTER CONTROLLERS SO DEPENDENCIES ARE CONSTRUCTOR INJECTED
            builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
            builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();

            //These lines warm up dlls and load into memory for automatic regisration
            var r = new ReplyRepository(null);
            var s = new BankService();

            builder.RegisterModule(new SelfRegisterModule());
            builder.RegisterModule(new RepositoryModule());
            builder.RegisterModule(new ServiceModule());
            builder.RegisterModule(new EFModule());


            builder
                   .RegisterType<ApplicationOAuthProvider>()
                   .As<IOAuthAuthorizationServerProvider>()
                   .PropertiesAutowired() // to automatically resolve IUserService
                   .SingleInstance(); // you only need one instance of this provider

            builder.RegisterType<SellutionUserStore>().As<IUserStore<ApplicationUser, int>>().InstancePerBackgroundJob().InstancePerRequest();
            builder.RegisterType<SellutionUserManager>().AsSelf().InstancePerBackgroundJob().InstancePerRequest();
            builder.RegisterType<SellutionRoleManager>().AsSelf().InstancePerBackgroundJob().InstancePerRequest();
            builder.RegisterType<SellutionSignInManager>().AsSelf().InstancePerBackgroundJob().InstancePerRequest();
            builder.Register<IAuthenticationManager>(c => HttpContext.Current.GetOwinContext().Authentication).InstancePerBackgroundJob().InstancePerRequest();
            builder.Register<IDataProtectionProvider>(c => app.GetDataProtectionProvider()).InstancePerBackgroundJob().InstancePerRequest();

            builder.RegisterType<TicketDataFormat>().As<ISecureDataFormat<AuthenticationTicket>>();

            builder.RegisterType<TicketSerializer>().As<IDataSerializer<AuthenticationTicket>>();
            builder.Register(c => new DpapiDataProtectionProvider("Sellution360").Create("ASP.NET Identity")).As<IDataProtector>();

            builder.RegisterType<CurrencyRatesJob>().AsSelf().InstancePerBackgroundJob();

            // BUILD THE CONTAINER
            var container = builder.Build();

            Hangfire.GlobalConfiguration.Configuration.UseAutofacActivator(container);
            JobActivator.Current = new AutofacJobActivator(container);


            // REPLACE THE MVC DEPENDENCY RESOLVER WITH AUTOFAC
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

            // Set the dependency resolver for Web API.
            var webApiResolver = new AutofacWebApiDependencyResolver(container);
            GlobalConfiguration.Configuration.DependencyResolver = webApiResolver;

            // Set the dependency resolver for MVC.
            var mvcResolver = new AutofacDependencyResolver(container);
            DependencyResolver.SetResolver(mvcResolver);


            // Register the Autofac middleware FIRST, then the Autofac MVC middleware.
            app.UseAutofacMiddleware(container);
            app.UseAutofacMvc().UseCors(CorsOptions.AllowAll);
            app.UseAutofacWebApi(GlobalConfiguration.Configuration).UseCors(CorsOptions.AllowAll); ;

            IocManager.Instance.IocContainer = container;

            ConfigureAuth(app);
            // Any connection or hub wire up and configuration should go here
            app.MapSignalR();

            Hangfire.GlobalConfiguration.Configuration.UseSqlServerStorage("DefaultConnection");
            app.UseHangfireDashboard();
            app.UseHangfireServer();

            RecurringJob.AddOrUpdate<CurrencyRatesJob>(j => j.Execute(), Cron.Minutely);
        }

CurrencyRatesJob.cs

 public class CurrencyRatesJob
    {
        private readonly ILogger _logger;
        private readonly IBusinessTypeService _businessTypeService;

        public CurrencyRatesJob(ILogger logger, IBusinessTypeService businessTypeService)
        {
            _logger = logger;
            _businessTypeService = businessTypeService;
        }

        public void Execute()
        {
            var types = _businessTypeService.GetBusinessTypes();
            _logger.Log("waqar");

        }
    }

1 ответ

InstancePerBackgroundJob создает Per Macthing Life Time сфера с BackgroundJobScope тег. Но Per Request случаи решаются в другой жизни с Request тег. Поэтому, когда вы пытаетесь решить Per Request объект в BackgroundJobScope время жизни, это дает ошибку. Он говорит, что вы можете разрешить меня только в Request время жизни не в корне или другой. Так что вы должны использовать Per Life Time Scope вместо Per Request,

Так что эти Per Life Time Scope Зарегистрированные объекты получат родители LifeScope. Если это синглтон, они будут в корне. Если их родительский срок жизни является запросом, они будут жить с этой областью запроса. Это то же самое для InstancePerBackgroundJob они будут жить в BackgroundJobScope продолжительность жизни.

И хорошо, что фоновые объекты имеют другую временную область жизни, если они используют область действия запроса, ваши объекты могут быть удалены после завершения запроса. Также, если они находятся в корневой области видимости, они никогда не будут уничтожены.

Другие вопросы по тегам