Quartz.NET, Castle Windsor – LifeStyle Per Job (Scoped)

Pokud používáte Quartz.NET (známá knihovna pro job-scheduling) s Castle Windsor (IoC/DI container), možná jste narazili na potřebu registrovat komponentu s životním cyklem „per job“ (LifestylePerJob). Na internetu najdete několik možností, které mají jedno společné – nefungují:

  • LifestylePerThread – neresetuje thread mezi joby, komponenta se použije pro více jobů
  • BoundTo<Job>() – nepodporuje typed factories, pokud si z nich vyžádáte službu v jobu
  • BoundTo<object>() – nepodporuje typed factories, pokud si z nich vyžádáte službu v jobu
  • Quartz.IJobFactory + LifestyleScoped – nepodporuje typed factories, pokud si z nich vyžádáte službu v jobu (scope odstartovaný v JobFactory se nezpropaguje do jobu!)

Naštěstí existuje „jednoduché“ řešení. Můžete použít LifestyleScoped, ale je potřeba scope začít/ukončit uvnitř jobu.

Pokud použijete samotný job jenom jako plumbing class kde práce samotná je zapouzdřena do samostatné služby (a měli byste to tak mít tak jako tak), pak stačí do jobu nainjectovat factory k takové službě a kernel pro ovládání scope:

public class MyJob : IJob
{
    private readonly IServiceFactory&lt;myservice&gt; myServiceFactory;
    private readonly IKernel kernel;

    public MyJob(IServiceFactory&lt;myservice&gt; myServiceFactory, IKernel kernel)
    {
        this.myServiceFactory = myServiceFactory;
        this.kernel = kernel;
    }

    public void Execute()
    {
        using (var scope = kernel.BeginScope())
        {
            // use your way to work with factories ;-)
            using (var myService = myServiceFactory.Create())
            {
                myService.DoWork();
            }
            // BTW: we have an extension method
            myServiceFactory.ExecuteAction(service =&amp;gt; service.DoWork());
        }
    }
}

…třída MyService class má všechny dependencies, které potřebuje a při použítí přes factory tím získáte nový pseudo-resolution-root. Svádí to samozřejmě použít rovnou kernel.Resolve+Release, ale nedělejte to… ;-)

References

Zanechat odpověď

Vyplňte detaily níže nebo klikněte na ikonu pro přihlášení:

Logo WordPress.com

Komentujete pomocí vašeho WordPress.com účtu. Odhlásit /  Změnit )

Facebook photo

Komentujete pomocí vašeho Facebook účtu. Odhlásit /  Změnit )

Připojování k %s