2014-10-28 5 views
10

Я пытаюсь создать простой тест Hangfire, но он не работает. Вот и весь важный код, и как я настроил его с помощью Hangire.Autofac. Не уверен, что мне здесь не хватает. Исключением, которое я получаю в dashbaord/hangfire, также ниже.Hangfire.Autofac с MVC app - инъекция не работает

public class AmazonSqsService : IAmazonSqsService 
{ 
    private readonly IBackgroundJobClient _backgroundJobClient; 
    private readonly ILogService _logService; 

    public AmazonSqsService(IBackgroundJobClient backgroundJobClient, ILogService logService) 
    { 

     _backgroundJobClient. = backgroundJobClient; 
     _logService= logService; 
    } 

    public async Task<string> Test() 
    { 

     return _backgroundJobClient.Enqueue(() => Looper()); 

    } 

    public void Looper() { 
     while (true) { _logService.Info("In Looper Loop"); Thread.Sleep(5000); } 
    } 
} 

public partial class Startup 
{ 
    public static IContainer ConfigureContainer() 
    { 
     var builder = new ContainerBuilder(); 
     RegisterApplicationComponents(builder); 
     AppGlobal.Container = builder.Build(); 
    } 

    public static void RegisterApplicationComponents(ContainerBuilder builder) 
    { 
     builder.RegisterType<LogService>().As<ILogService>().InstancePerLifetimeScope(); 
     builder.RegisterType<AmazonSqsService>().As<IAmazonSqsService>().InstancePerLifetimeScope(); 
     builder.RegisterType<BackgroundJobClient>().As<IBackgroundJobClient>().InstancePerLifetimeScope(); 
     builder.Register(c => JobStorage.Current).As<JobStorage>().InstancePerLifetimeScope(); 
     builder.Register(c => new StateMachineFactory(JobStorage.Current)).As<IStateMachineFactory>().InstancePerLifetimeScope(); 

    } 

    public static void ConfigureHangfire(IAppBuilder app) 
    { 
     app.UseHangfire(config => 
     { 
      config.UseAutofacActivator(AppGlobal.Container); 
      config.UseSqlServerStorage("DefaultDatabase"); 
      config.UseServer(); 
     }); 
    } 
} 

Однако в приборной панели я получаю эту ошибку для выполнения этой задачи:

Ошибка Исключение во время активации работы. Autofac.Core.Registration.ComponentNotRegisteredException

Запрошенная служба «App.Services.AmazonSqsService» не была зарегистрирована. Чтобы избежать этого исключения, зарегистрируйте компонент для предоставления услуги, проверьте регистрацию службы с помощью IsRegistered() или используйте метод ResolveOptional() для разрешения дополнительной зависимости.

ответ

21

В конечном итоге это отразилось.

Правильное использование:

public class Service : IService { 
     public void MethodToQueue() { ... } 
} 

public class AnyOtherClass { 
    public void StartTasks() { 
      BackgroundJob.Enqueue<IService>(x => x.MethodToQueue()); //Good 
    } 
} 

Неправильное использование (то, что я делаю неправильно)

public class Service : IService { 
    public void StartTasks() { 
      BackgroundJob.Enqueue(() => this.MethodToQueue()); //Bad 
    } 

     public void MethodToQueue() { ... } 
} 

public class AnyOtherClass { 
    public AnyOtherClass(IService service) { 
      service.StartTasks(); 
    } 
} 
+0

я делал ту же ошибку .. Спасибо .. !! – Praveen

 Смежные вопросы

  • Нет связанных вопросов^_^