asp.net web api2 - Autofac job activator with Hangfire throwing exception DependencyResolutionException -


my project structure same :

https://github.com/marlabsinc/webapi-angularjs-spa

i have followed instructions in :

http://docs.hangfire.io/en/latest/background-methods/using-ioc-containers.html

so have created container job activator.

in bootstrapper.cs

containerbuilder.registertype<databasefactory>().as<idatabasefactory>().asimplementedinterfaces().instanceperapirequest(); containerbuilder.registertype<unitofwork>().as<iunitofwork>().asimplementedinterfaces().instanceperapirequest(); containerbuilder.registerapicontrollers(system.reflection.assembly.getexecutingassembly()); icontainer container = containerbuilder.build();  hangfire.globalconfiguration.configuration .useautofacactivator(container); jobactivator.current = new autofacjobactivator(container); system.web.http.globalconfiguration.configuration.dependencyresolver = new autofacwebapidependencyresolver(container); 

my startup class has method :

globalconfiguration.configuration .usesqlserverstorage("entitiesdb", new sqlserverstorageoptions {     prepareschemaifnecessary = false,     invisibilitytimeout = timespan.fromminutes(30) });  app.usehangfiredashboard(); app.usehangfireserver(); 

in controller : trying update status of 2000 invoices "approved" method straightforward follows :

foreach(int id in invoiceids) {    backgroundjob.enqueue<iinvoiceservice>(a => a.updateinvoice(id)); } 

now when query in sql :

 select * hangfire.[state] 

i following exception in data column:

{"failedat":"2015-07-07t10:00:40.9454943z","exceptiontype":"autofac.core.dependencyresolutionexception","exceptionmessage":"no scope tag matching 'autofacwebrequest' visible scope in instance requested. indicates component registered per-http request being requested singleinstance() component (or similar scenario.) under web integration request dependencies dependencyresolver.current or ilifetimescopeprovider.requestlifetime, never container itself.","exceptiondetails":"autofac.core.dependencyresolutionexception: no scope tag matching 'autofacwebrequest' visible scope in instance requested. indicates component registered per-http request being requested singleinstance() component (or similar scenario.) under web integration request dependencies dependencyresolver.current or ilifetimescopeprovider.requestlifetime, never container itself.\r\n @ autofac.core.lifetime.matchingscopelifetime.findscope(isharinglifetimescope mostnestedvisiblescope)\r\n @ autofac.core.resolving.instancelookup..ctor(icomponentregistration registration, iresolveoperation context, isharinglifetimescope mostnestedvisiblescope, ienumerable1 parameters)\r\n @ autofac.core.resolving.resolveoperation.getorcreateinstance(isharinglifetimescope currentoperationscope, icomponentregistration registration, ienumerable1 parameters)\r\n @ autofac.core.resolving.resolveoperation.resolvecomponent(icomponentregistration registration, ienumerable1 parameters)\r\n @ autofac.core.resolving.resolveoperation.execute(icomponentregistration registration, ienumerable1 parameters)\r\n @ autofac.core.lifetime.lifetimescope.resolvecomponent(icomponentregistration registration, ienumerable1 parameters)\r\n @ autofac.core.container.resolvecomponent(icomponentregistration registration, ienumerable1 parameters)\r\n @ autofac.resolutionextensions.tryresolveservice(icomponentcontext context, service service, ienumerable1 parameters, object& instance)\r\n @ autofac.resolutionextensions.resolveservice(icomponentcontext context, service service, ienumerable1 parameters)\r\n @ autofac.resolutionextensions.resolve(icomponentcontext context, type servicetype, ienumerable`1 parameters)\r\n @ autofac.resolutionextensions.resolve(icomponentcontext context, type servicetype)\r\n @ hangfire.autofacjobactivator.activatejob(type jobtype)\r\n @ hangfire.common.job.activate(jobactivator activator)"}

can please me understand doing wrong ?

you using instanceperapirequest ioc container knows create new instance each api request.

but, background job not executing inside api request, ioc container not know how resolve dependencies.

from hangfire docs:

httpcontext not available

request information not available during instantiation of target type. if register dependencies in request scope (instanceperhttprequest in autofac, inrequestscope in ninject , on), exception thrown during job activation process.

so, entire dependency graph should available. either register additional services without using request scope, or use separate instance of container if ioc container not support dependency registrations multiple scopes.

according this related question, autofac not support registering multiple scopes out of box need either:

  1. use "lower" scope such "instanceperdependency", or
  2. use separate ioc container background jobs.

update:

the hangfire autofac integration package introduces instanceperbackgroundjob() extension method, , suggests autofac support registering multiple scopes this:

builder.registertype<database>()        .instanceperbackgroundjob()        .instanceperhttprequest(); 

however, it's available in 1.2.0-beta1 release of hangfire.autofac requires hangfire 1.5.0-beta1.


Comments

Popular posts from this blog

How to provide Authorization & Authentication using Asp.net, C#? -

toolbar - How to add link to user registration inside toobar in admin joomla 3 custom component -

How to use Authorization & Authentication in Asp.net, C#? -