使用ioc容器¶

正如我在 上一节 中所述,在调用实例方法之前,Hangfire 使用 JobActivator 来实例化目标类型。您可以通过重写类型的实例化来执行更复杂的逻辑。例如,您可以在项目中使用IoC容器:

  1. public class ContainerJobActivator : JobActivator
  2. {
  3. private IContainer _container;
  4.  
  5. public ContainerJobActivator(IContainer container)
  6. {
  7. _container = container;
  8. }
  9.  
  10. public override object ActivateJob(Type type)
  11. {
  12. return _container.Resolve(type);
  13. }
  14. }

然后在启动Hangfire服务器之前,将其注册:

  1. // Somewhere in bootstrap logic, for example in the Global.asax.cs file
  2. var container = new Container();
  3. GlobalConfiguration.Configuration.UseActivator(new ContainerJobActivator(container));
  4. ...
  5. app.UseHangfireServer();

为了简化初始安装,NuGet上已经有一些集成软件包:

  1. GlobalConfiguration.Configuration.UseNinjectActivator(kernel);

HttpContext 不可用

在目标类型的实例化过程中,Request information是不可用的。如果您在一个请求作用域(Autofac的 InstancePerHttpRequest , Ninject的 InRequestScope ) 中注册了依赖项,则在任务激活过程中将抛出异常。

所以, 整个依赖项必须是可用的 。要么注册其他服务而不使用请求作用域, 或者当您的ioc容器不支持多个作用域时使用不同的实例。

原文:

http://hangfirezh.zhs.press/background-methods/using-ioc-containers.html