asp.net-core - Hangfire找不到注册服务

标签 asp.net-core dependency-injection hangfire

我对 Hangfire 有疑问,很可能是因为我对某些主题一无所知。

我有一个主机/插件基础设施,其中每个插件在运行时加载并注册其接口(interface)。

public void ConfigureServices(IServiceCollection services, IConfigurationRoot Configuration)
{
    services.AddTransient<IManager, Manager>();
    services.AddTransient<IAnotherManager, AnotherManager>();

    this.AddControllers(services);            
}

某些插件可能会使用 Hangfire 添加作业,这些作业也在运行时设置

public void ScheduleJobs() 
{
   RecurringJob.AddOrUpdate<IManager>(n => n.SayHello(), Cron.Monthly);
}

我遇到的问题是,虽然直接在主机中注册的任何服务都可以在hangfire中正确解决, 未找到在外部程序集中定义的所有接口(interface)(例如 IManager)。

我添加了一个客户 JobActivator,在其中传递 IServiceCollection,我实际上可以看到这些外部服务已注册(并且我可以在除 Hangfire 之外的其他任何地方使用它们),但仍然 在JobActivator中,当Hangfire尝试解析外部服务时,它失败了。

public override object ActivateJob(Type type)
{
    // _serviceCollection contains the IManager service
    var _provider = _serviceCollection.BuildServiceProvider();
    
    // this will throw an Exception => No service for type '[...].IManager' has been registered.
    var implementation = _provider.GetRequiredService(type);
    return implementation;
}

在同一示例中,如果我使用默认 JobActivator,则得到的异常是 System.MissingMethodException:无法创建接口(interface)实例。

我可以使用类而不是接口(interface)对作业进行排队,但这不是重点,无论如何,如果类注入(inject)了服务,这些服务也不会得到解决。

我错过了什么?

最佳答案

问题已经解决了。解决方案是为hangfire添加特定的IoC容器。我用的是Unity。这样就可以正确解决依赖关系。

关于asp.net-core - Hangfire找不到注册服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63827427/

相关文章:

c# - Funq 支持 ResolveAll 吗?

java - Google Guice 中的 AssistedInject 和 MapBinder

c# - 通过控制台应用程序设置作业时如何访问hangfire仪表板

c# - 使用 .NET Core 进行 Hangfire 依赖注入(inject)

asp.net-core - 从 .net core 5 中的 View 访问 Controller 实例

c# - 带有 Blazor 服务器端组件的 MVC 应用程序中的防伪 token 验证

c# - "ASPNETCORE_ENVIRONMENT": "Development" 时无法解析来自根提供程序的范围服务

c# - 如何将异步方法作为操作传递?

c# - 如何在 Asp.Net 5 (MVC 6) 中使用 Entity Framework 6.x

asp.net - ASP Core Azure Active Directory - 获取名字和姓氏