【问题标题】:A suitable constructor for my type using DI could not be located找不到适合我使用 DI 的类型的构造函数
【发布时间】: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&lt;IJobActivator&gt;(new SimpleInjectorJobActivator(container));吗?

标签: c# asp.net-core asp.net-core-webapi simple-injector hangfire


【解决方案1】:

我不确定Hangfire 中的 DI 是否用于此目的。

你需要依赖注入来解决内部依赖, 不解析你要使用的主要类型。

您可以查看文档here

检查this同样问题的答案。

【讨论】:

    猜你喜欢
    • 2020-10-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    相关资源
    最近更新 更多