【发布时间】:2020-07-14 14:56:56
【问题描述】:
我有一个使用 Hangfire 进行后台作业的 .NET 核心 WebAPI 项目。我正在尝试为 DI 设置 Simple Injector。我的项目有一个IFoo 和一个Foo 类,如下所示
public interface IFoo
{
void DoSomething();
}
public class Foo : IFoo
{
public Foo() { }
public void DoSomething()
{
Console.WriteLine($"Foo::DoSomething");
}
}
以下是我如何设置 Simple Injector 容器。我正在使用Hangfire.SimpleInjectornuget 包
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
var container = new SimpleInjector.Container();
container.Register<IFoo, Foo>();
GlobalConfiguration.Configuration.UseActivator(
new Hangfire.SimpleInjector.SimpleInjectorJobActivator(container));
services.AddHangfire(x => x.UseSqlServerStorage(<My Connection string>));
services.AddHangfireServer();
services.AddControllers();
}
}
后台作业在控制器中设置如下
public IActionResult DoSomething()
{
var jobID = BackgroundJob.Enqueue<IFoo>( x => x.DoSomething());
return Ok();
}
但该作业失败并出现以下堆栈跟踪。
处理后台作业时发生异常。
System.InvalidOperationException 适合类型的构造函数 找不到“MyWebAPI.Controllers.IFoo”。确保类型是 为公共的所有参数注册了具体和服务 构造函数。
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider, Type, Object[])
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider, Type)
at Hangfire.AspNetCore.AspNetCoreJobActivatorScope.Resolve(Type type)
at Hangfire.Server.CoreBackgroundJobPerformer.Perform(PerformContext context)
at Hangfire.Server.BackgroundJobPerformer.<>c__DisplayClass9_0.<PerformJobWithFilters>b__0()
at Hangfire.Server.BackgroundJobPerformer.InvokePerformFilter(IServerFilter, PerformingContext, Func`1)
at Hangfire.Server.BackgroundJobPerformer.<>c__DisplayClass9_1.<PerformJobWithFilters>b__2()
at Hangfire.Server.BackgroundJobPerformer.PerformJobWithFilters(PerformContext, IEnumerable`1)
at Hangfire.Server.BackgroundJobPerformer.Perform(PerformContext context)
at Hangfire.Server.Worker.PerformJob(BackgroundProcessContext, IStorageConnection, String)
我在设置这一切时做错了什么?
【问题讨论】:
-
我不知道解决方案,但我确实看到了问题:没有调用 Simple Injector 来解析您的类型。堆栈跟踪显示 Handfire 只是调用核心 DI 基础设施。
-
您的代码没有告诉 .NET Core 的 DI 在任何地方使用 SimpleInjector。您需要致电
services.AddSimpleInjector(container,...) -
GlobalConfiguration的使用似乎很可疑 -
可能是
GlobalConfiguration.Configuration.UseActivator不起作用 i.c.w。AddHangfire?你试过打电话给services.AddSingleton<IJobActivator>(new SimpleInjectorJobActivator(container));吗?
标签: c# asp.net-core asp.net-core-webapi simple-injector hangfire