我对 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/