2015-09-14 2 views
1

Мы используем Spring.net для управления нашими инъекциями зависимостей, но когда мы добираемся до метода, запускаемого hangfire, классы зависимостей равны нулю. Использование других контейнеров IoC еще не является вариантом - пожалуйста, не спрашивайте, почему. И btw, spring.net может вводить классы зависимостей, если uploadDoc() не запускается через hangfire, то есть в потоке приложения.Использование Spring.Net с HangFire

код как это:

class docUpload { 
    IDependencyClass1 DClass1; 
    IDependencyClass2 DClass2; 

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

Тогда весной 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"> 

Затем замедленное воспламенение выполняет нить вроде этого:

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

Любые идеи, почему внутри замедленное воспламенение нити, Впрыск зависимостей spring.net не работает? Он работает, если работает в потоке приложения.

+1

Вам необходимо разместить реальный код. 'docUpload' даже не компилируется, и этот фрагмент' xml' не будет выглядеть как действительный формат 'spring'. – jsanalytics

ответ

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); 
    } 
} 

Затем вам нужно зарегистрировать его в качестве текущего активатора работы перед запуском сервера замедленного воспламенения:

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

Вы можете прочитать больше об использовании контейнеров IoC в appropriate chapter документации Hangfire

Смежные вопросы