2016-07-22 18 views
1

Ich habe gerade angefangen, HangFire zu verwenden. Die Jobs scheinen gut zu funktionieren, wenn ich sie lokal von IIS Express aus starte, aber wenn ich sie auf meinem Dev-Server ausführe, erhalte ich Fehler, die kein parameterloser Konstruktor definiert. Ich habe früher Simple Injector benutzt, aber jetzt bin ich zu Autofac umgezogen.HangFire Recurring Jobs fehlgeschlagen auf Server mit Autofac.Core.Registration.ComponentNotRegisteredException oder Keine Ausnahme ohne Parameter

public class Startup 
{ 

    public void Configuration(IAppBuilder app) 
    { 
     ConfigureAuth(app); 
     ConfigureIoc(app); 
     ConfigureRoutes(); 
     ConfigureHangfire(app); 
     ScheduleXeroMonitor(); 
    } 

    public void ConfigureHangfire(IAppBuilder app) 
    { 
     var authList = new List<IDashboardAuthorizationFilter> 
     { 
      new ClaimsBasedAuthorizationFilter("role", "admin") 
     }; 
     var options = new DashboardOptions 
     { 
      Authorization = authList, 
      AppPath = "/Manage" 

     }; 

     app.UseHangfireDashboard("/hangfire", options); 
     app.UseHangfireServer(); 
    } 

    public void ConfigureRoutes() 
    { 
     BundleTable.EnableOptimizations = true; 
     AreaRegistration.RegisterAllAreas(); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
    } 

    public void ConfigureIoc(IAppBuilder app) 
    { 
     var builder = DependencyRegistrar.RegisterClasses(); 
     var container = builder.Build(); 
     app.UseAutofacMiddleware(container); 
     app.UseAutofacMvc(); 
     GlobalConfiguration.Configuration.UseAutofacActivator(container); 
     DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
    } 

    public void ConfigureAuth(IAppBuilder app) 
    { 
     app.UseCookieAuthentication(new CookieAuthenticationOptions() 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Login"), 
      CookieSecure = CookieSecureOption.SameAsRequest, 
     }); 
     app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions() 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ExternalBearer, 
      AuthenticationMode = AuthenticationMode.Passive 
     }); 


     AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Name; 
    } 

    public void ScheduleXeroMonitor() 
    {    
     var backGroundWorker = DependencyResolver.Current.GetService<IXeroBackGroundWorker>();    
     RecurringJob.AddOrUpdate("XeroPolling",() => backGroundWorker.PollJobs(), Cron.Minutely); //change the Cron to every 5 minutes  

     var emailWorker = DependencyResolver.Current.GetService<IEmailService>(); 
     RecurringJob.AddOrUpdate("EmailPolling",() => emailWorker.SendQueuedEmails(), Cron.Minutely);//"*/10 * * * *" 
    } 
} 

Hier ist der Code, wo ich meine Abhängigkeiten registrieren.

public class DependencyRegistrar 
{ 
    public static ContainerBuilder RegisterClasses() 
    { 
     var builder = new ContainerBuilder(); 
     builder.RegisterType<XeroSyncRestClient>().As<IXeroSyncRestClient>().InstancePerLifetimeScope(); 
     builder.RegisterType<XeroBackGroundWorker>().As<IXeroBackGroundWorker>().InstancePerLifetimeScope(); 
     builder.RegisterType<EmailService>().As<IEmailService>().InstancePerLifetimeScope(); 
     builder.RegisterControllers(Assembly.GetExecutingAssembly());    
     return builder; 
    } 

} 

Könnte mir bitte jemand sagen, was ich falsch mache? Ich habe auch gepostet dies auf Hangfire Diskussionsforum

Antwort

1

Da Sie bereits AutoFac in GlobalConfiguration.Configuration.UseAutofacActivator(container); Sie nur einfach let hangfire und Autofac resolve Abhängigkeiten für Sie hinzugefügt.

public void ScheduleXeroMonitor() 
{    
    //var backGroundWorker = DependencyResolver.Current.GetService<IXeroBackGroundWorker>(); --> let hangfire and autofac do this for you   
    RecurringJob.AddOrUpdate<IXeroBackGroundWorker>("XeroPolling", backGroundWorker => backGroundWorker.PollJobs(), Cron.Minutely); //change the Cron to every 5 minutes  

    //var emailWorker = DependencyResolver.Current.GetService<IEmailService>();--> let hangfire and autofac do this for you   
    RecurringJob.AddOrUpdate<IEmailService>("EmailPolling", emailWorker => emailWorker.SendQueuedEmails(), Cron.Minutely);//"*/10 * * * *" 
}