2014-11-19 12 views
7

Próbuję użyć TopShelf razem z Quartz.net i Autofac. Kod, który mam poniżej działa dobrze. Jednak linia ta:Topshelf musi używać automatycznej kwarcowej fabryki Autofac.

cfg.UsingQuartzJobFactory(() => container.Resolve<IJobFactory>()); 

wydaje się być niewłaściwym sposobem robienia rzeczy. Czy istnieje lepszy sposób na poinformowanie Topshelf, aby użył niestandardowego autofacku? Jaki życiowy zasięg będzie miał jobfactory? Obawiam się, że ta linia kodu sprawi mi kiedyś ból głowy w przyszłości. Jak zwolnić pracę, kiedy nie jest już potrzebna? Czy ta linia jest w porządku?

class Poller : IJob 
{ 
    private readonly ILogger _log; 

    public Poller(ILogger log) 
    { 
     _log = log; 
     _log.Info("Instantiating..."); 
    } 

    public void Execute(IJobExecutionContext context) 
    { 
     _log.Info("Executing..."); 
    } 
} 

class Program 
{ 
    static Autofac.IContainer BuildContainer() 
    { 
     var builder = new ContainerBuilder(); 

     builder.RegisterModule<NLogModule>(); 
     builder.RegisterModule<QuartzAutofacFactoryModule>(); 
     builder.RegisterModule(new QuartzAutofacJobsModule(typeof(Poller).Assembly)); 

     var container = builder.Build(); 
     return container; 
    } 

    static void Main(string[] args) 
    { 
     var container = BuildContainer(); 

     HostFactory.Run(cfg => 
     { 
      cfg.UseNLog(); 
      cfg.UseAutofacContainer(container); 
      cfg.SetDescription("DESCRIPTION"); 
      cfg.SetDisplayName("DISPLAY"); 
      cfg.SetServiceName("NAME"); 

      cfg.UsingQuartzJobFactory(() => container.Resolve<IJobFactory>()); 

      cfg.ScheduleQuartzJobAsService(q => 
      { 
       q.WithJob(() => JobBuilder.Create<Poller>().Build()); 
       q.AddTrigger(() => TriggerBuilder.Create().WithSimpleSchedule(b => b.WithIntervalInSeconds(20).RepeatForever()).Build()); 
      }); 

      cfg.StartAutomatically(); 
      cfg.RunAsLocalSystem(); 

     }); 
    } 
} 

Dla porównania: TopShelf.Quartz.ScheduleHobHostConfiguratorExtensions

odwoływać także: Autofac.Extras.Quartz.QuartzAutofacFactoryModule

Odpowiedz

0

myślę, że należy zainicjować Server kwarcowy z pojemnika, w tym przykładzie używać jedności, ale jestem pewien, że praca z innych pojemników.

try 
     { 
      var container = new UnityContainer(); 
      schedulerFactory = CreateSchedulerFactory(); 
      quartzscheduler = GetScheduler(); 
      SyncPost.Initialize.RepositoryConfig(container); 
      SyncPost.Initialize.AddToSchedulerContextCustomVars(quartzscheduler, container); 
      quartzscheduler.JobFactory = new JobFactoryInjection(container); 

     } 
     catch (Exception e) 
     { 
      logger.Error("Server initialization failed:" + e.Message, e); 
      throw; 
     } 

gdzie JobFactoryInjection wdrożyć IJobFactory:

public class JobFactoryInjection : IJobFactory 
{ 

     private readonly UnityContainer container = new UnityContainer(); 

     public JobFactoryInjection(UnityContainer container) 
     { 

      if (container == null) throw new ArgumentNullException("container", "Container is null"); 
      this.container = container; 
     } 



    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) { 


      // Return job registrated in container 
      bundle.JobDetail.JobDataMap.Put(SyncUtils.ContextKeyCenterCode, scheduler.Context.Get(SyncUtils.ContextKeyCenterCode)); 
      return (IJob)container.Resolve(bundle.JobDetail.JobType); 

    } 

    public void ReturnJob(IJob job) { 

    } 
} 

O JobFactory życia, nie martw się o to. Z dokumentacji Quartz: "JobFactory po prostu aktywuje nową instancję klasy zadań.Możesz chcieć stworzyć własną implementację JobFactory, aby wykonać rzeczy takie jak posiadanie kontenera IoC lub DI aplikacji w aplikacji produkowania/inicjowania instancji zadania"

Powiązane problemy