Hangfire,Autofac和WebApi

时间:2015-07-08 07:21:18

标签: asp.net-web-api autofac hangfire

我最近了解了Hangfire,但到目前为止还没有运气。我的项目使用autofac,所以我添加了HangFire.1.4.3& HangFire.Autofac.1.1.0 nuget包到我的项目。接下来是文档我创建了Startup类并在那里注册了Hangfire

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

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

之后我更新了WebApiConfig并在Hangfire中注册了我的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);
}

当我尝试运行像

这样的Hangfire工作时
IObject someObject = MyObject();    
var jobId = BackgroundJob.Enqueue<IMyInterface>(x
                    => x.MyMethod(someObject));

我收到以下错误

System.InvalidOperationException MyNamespace.IMyInterface类型不包含带签名MyMethod(IObject1)`的方法 在Hangfire.Storage.InvocationData.Deserialize() 可能是什么问题?

2 个答案:

答案 0 :(得分:0)

问题在于篝火的工作方式。它序列化参数,如果泛型不能反复使用它。解决方法是创建一个可以轻松序列化/绝望化并运行所需代码的中介。

答案 1 :(得分:0)

您需要在Startup.cs文件中添加以下代码。

private void ConfigureAutofac(HttpConfiguration config, IAppBuilder app)
{        
   var requestTag = MatchingScopeLifetimeTags.RequestLifetimeScopeTag;
   var jobTag = AutofacJobActivator.LifetimeScopeTag;
   builder.RegisterType<MyClass>().As<IMyInterface>().InstancePerRequest();
}