Не удалось найти подходящий конструктор для моего типа с использованием DI - PullRequest
0 голосов
/ 14 июля 2020

У меня есть основной проект WebAPI. NET, который использует Hangfire для фоновых заданий. Я пытаюсь настроить простой инжектор для DI. В моем проекте есть классы IFoo и Foo, которые выглядят следующим образом:

public interface IFoo
{
    void DoSomething();
}

public class Foo : IFoo
{
    public Foo() { }
    public void DoSomething()
    {
        Console.WriteLine($"Foo::DoSomething");
    }
}

Ниже показано, как я настраиваю контейнер Simple Injector. Я использую Hangfire.SimpleInjector пакет nuget

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)

Что я делаю неправильно, настраивая все это?

1 Ответ

0 голосов
/ 14 июля 2020

Я не уверен, что DI в Hangfire предназначен для этой цели.

Вам нужна инъекция зависимостей для разрешения внутренних зависимостей, а не для разрешения основного типа, который вы хотите использовать.

Вы можете проверить документацию здесь .

Проверить этот ответ с той же проблемой.

...