1

我们使用 spring.net 来管理依赖注入,但是当我们使用 hangfire 运行的方法时,依赖类为空。使用其他 IoC 容器还不是一种选择——请不要问为什么。顺便说一句,如果uploadDoc() 没有通过hangfire 运行,即在应用程序的线程中,spring.net 能够注入依赖类。

代码是这样的:

class docUpload {
   IDependencyClass1 DClass1;
   IDependencyClass2 DClass2;

   uploadDoc() {
      DClass1.doSomething(); //Dclass1 is null here
   }
}

然后在spring xml中:

<object id="docUpload " type="some code here">
    <property name="DClass1" ref="dClass1" />
    <property name="DClass2" ref="dClass2" />
</object>

<object id="dClass1" type="some code here">
<object id="dClass2" type="some code here">

然后hangfire像这样执行线程:

hangfireclass.jobclient.enqueue(() => docUpload.uploadDoc());

任何想法为什么在hangfire线程中,spring.net的依赖注入不起作用?如果在应用程序的线程中运行,它可以工作。

4

1 回答 1

0

@ma22!

可以将 Spring.NET 与 Hangfire 一起使用。你应该像这样实现你的 JobActivator:

public class SpringNetActivator: JobActivator
{
    private readonly IApplicationContext _springContext;
    public SpringNetActivator(IApplicationContext springContext)
    {
        _springContext = springContext;
    }

    public override object ActivateJob(Type jobType)
    {
        return _springContext.GetObject(jobType.Name);
    }

    public override JobActivatorScope BeginScope(JobActivatorContext context)
    {
        //some code here
        return base.BeginScope(context);
    }
}

然后,您需要在启动 Hangfire 服务器之前将其注册为当前作业激活器:

var springActivator = new SpringNetActivator(ContextRegistry.GetContext());
GlobalConfiguration.Configuration.UseActivator(springActivator);
...
app.UseHangfireServer();

您可以在Hangfire 文档的相应章节中阅读有关使用 IoC 容器的更多信息

于 2016-12-12T11:13:22.247 回答