2014-11-19 18 views
7

TopShelf'i Quartz.net ve Autofac ile birlikte kullanmaya çalışıyorum. Aşağıda sahip olduğum kod sadece iyi çalışıyor. Bununla birlikte, bu satır: yanlış şeyler yapma gibi görünüyor. Topshelf'e özel otofac iş gücünü kullanmanın daha iyi bir yolu var mı? İşyerindeki yaşam süresi ne kadar olacak? Endişeleniyorum ki bu kod satırı gelecekte bana bazı baş ağrılarına neden olacak. Artık gerekmediğinde işyerini nasıl serbest bırakırım? Bu hat tamam mı? Başvuru içinTopshelf'in Autofac'ın Quartz fabrikasını kullanması gerekiyor

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

     }); 
    } 
} 

: Bu örnek, birliğini kullanmak, Autofac.Extras.Quartz.QuartzAutofacFactoryModule

cevap

0

Sana konteyner ile kuvars Sunucusu başlatmak gerektiğini düşünüyorum, ama başka kaplarla bu işi eminim: TopShelf.Quartz.ScheduleHobHostConfiguratorExtensions

Ayrıca başvuru.

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

JobFactoryInjection IJobFactory uygulamak

: JobFactory ömrü Hakkında

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) { 

    } 
} 

, bu konuda endişelenmeyin. Quartz dokümantasyonundan: "JobFactory sadece iş sınıfının yeni bir örneğini etkinleştirir. Uygulamanızın IoC veya DI kapsayıcısının iş örneğini oluşturması/başlatması gibi şeyleri gerçekleştirmek için kendi JobFactory uygulamanızı oluşturmak isteyebilirsiniz"