Собственный сервис - ни один сервис для данного типа не зарегистрирован

Я хотел бы использовать Hangfire в своем приложении ASP.NET Core, но у меня появилось сообщение об ошибке:

Служба для типа не зарегистрирована

Вот мой код: Сервис:

public class MyService: IMyService
{
    private readonly MyContext _context;

    public MyService(MyContext context)
    {
        _context = context;
    }

    // some code
}

public interface IMyService
{
      //some code
}

В Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IMyService, MyService>();
    // another services
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider)
{
    app.UseHangfireDashboard();
    app.UseHangfireServer();

    RecurringJob.AddOrUpdate(() => serviceProvider.GetService<IMyService>().MyMethod(), Cron.Minutely);
}

У вас есть идеи, почему сервис не зарегистрирован?


person mskuratowski    schedule 19.09.2016    source источник
comment
Здесь IRssService должно быть таким же, как IMyService?   -  person DavidG    schedule 19.09.2016
comment
@DavidG Да, это то же самое. Виноват. Я уже исправил это.   -  person mskuratowski    schedule 19.09.2016
comment
проблема, скорее всего, такая же, как и в этом вопросе, MyContext зарегистрирован как ограниченный или вообще не зарегистрирован stackoverflow.com/questions/39369054/   -  person Joe Audette    schedule 19.09.2016
comment
Разве вы не можете использовать для этого правильный метод Hangfire? Что-то вроде этого: RecurringJob.AddOrUpdate<IMyService>(s => s.MyMethod(), Cron.Minutely);   -  person DavidG    schedule 19.09.2016
comment
@DavidG Да, это работает. Большое спасибо !   -  person mskuratowski    schedule 19.09.2016


Ответы (1)


Hangfire подключается к уже существующей инъекции зависимостей, поэтому вам не нужно использовать serviceProvider.GetService для получения вашего объекта. Вместо этого используйте соответствующую функцию Hangfire, чтобы разрешить зависимость:

RecurringJob.AddOrUpdate<IMyService>(s => s.MyMethod(), Cron.Minutely);
person DavidG    schedule 19.09.2016
comment
это также работало для BackgroundJob.Enqueue BackgroundJob.Enqueue<IMyService>(ms => ms.MyMethod()); - person Mihai Popescu; 02.02.2017