3

我最近了解了 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 类型在 Hangfire.Storage.InvocationData.Deserialize() 中不包含带有签名 MyMethod(IObject1)` 的方法 可能是什么问题?

4

2 回答 2

0

问题在于hangfire的工作方式。它序列化参数,并且在泛型的情况下无法将其反序列化。解决方法是创建一个可以轻松序列化/反序列化并运行您需要的代码的中介。

于 2015-07-09T08:23:13.687 回答
0

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

private void ConfigureAutofac(HttpConfiguration config, IAppBuilder app)
{        
   var requestTag = MatchingScopeLifetimeTags.RequestLifetimeScopeTag;
   var jobTag = AutofacJobActivator.LifetimeScopeTag;
   builder.RegisterType<MyClass>().As<IMyInterface>().InstancePerRequest();
}
于 2019-09-16T16:19:41.183 回答