2015-07-08 3 views
3

Недавно я узнал о Hangfire, но до сих пор не повезло. Мой проект использует autofac, поэтому я добавил HangFire.1.4.3 & HangFire.Autofac.1.1.0 пакеты nuget для моего проекта. Вслед за документацией Я создал класс запуска и зарегистрирован замедленное воспламенение тамHangfire, Autofac и WebApi

public void Configuration(IAppBuilder app) 
{ 
     GlobalConfiguration.Configuration 
        .UseSqlServerStorage("NavigatorConnectionString"); 

     app.UseHangfireDashboard(); 
     app.UseHangfireServer(); 
} 

После этого я обновил WebApiConfig и зарегистрировал свой Autofac контейнер в замедленном воспламенении

private static void RegisterDependencies(HttpConfiguration config) 
{ 
    var builder = new ContainerBuilder(); 
    ... 
    var container = builder.Build(); 
    ... 
    config.DependencyResolver = new AutofacWebApiDependencyResolver(container); 
    Hangfire.GlobalConfiguration.Configuration.UseAutofacActivator(container); 
} 

Когда я пытаюсь запустить замедленное воспламенение работы как

IObject someObject = MyObject();  
var jobId = BackgroundJob.Enqueue<IMyInterface>(x 
        => x.MyMethod(someObject)); 

Я получаю следующую ошибку

системы. InvalidOperationException Тип MyNamespace.IMyInterface не содержит метода с сигнатурой MyMethod (IObject1) ` в Hangfire.Storage.InvocationData.Deserialize() В чем может быть проблема?

+0

Я понял, что решение не работает, когда интерфейс имеет общее объявление. Сорт public TResult MyMethod (IObject query) – vityanya

ответ

0

Проблема заключается в способе работы с огнем. Он сериализует параметры, а в случае дженериков не может десриализовать его. Обходной путь создает посредник, который может быть легко сериализован/desirialized и запустить код, который вам нужен.

+1

Вы должны предоставить пример медиатора, если это возможно. – BenjaminPaul

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