正如我在上一节中所说,Hangfire在调用实例方法之前使用JobActivator类实例化目标类型。您可以重写它的行为,以对类型实例化执行更复杂的逻辑。例如,您可以告诉它使用项目中使用的IoC容器:
public class ContainerJobActivator : JobActivator
{
private IContainer _container;
public ContainerJobActivator(IContainer container)
{
_container = container;
}
public override object ActivateJob(Type type)
{
return _container.Resolve(type);
}
}
然后,您需要在启动Hangfire服务器之前将其注册为当前作业激活器:
// Somewhere in bootstrap logic, for example in the Global.asax.cs file
var container = new Container();
GlobalConfiguration.Configuration.UseActivator(new ContainerJobActivator(container));
...
app.UseHangfireServer();
为了简化初始安装,NuGet上已经提供了一些集成包。请查看官方网站上的扩展页面以获取所有可用扩展包的列表:
https://www.hangfire.io/extensions.html#ioc-containers
其中一些激活器还提供了GlobalConfiguration类的扩展方法:
GlobalConfiguration.Configuration.UseNinjectActivator(kernel);
HttpContext不可用。在目标类型的实例化期间,请求信息不可用。如果在请求范围(Autofac中的InstancePerHttpRequest、Ninject中的InRequestScope等)中注册依赖项,则在作业激活过程中将引发异常。
因此,整个依赖关系图应该是可用的。在不使用请求作用域的情况下注册其他服务,或者如果IoC容器不支持多个作用域的依赖关系注册,则使用单独的容器实例。