Sto provando a utilizzare TopShelf insieme a Quartz.net e Autofac. Il codice che ho qui sotto funziona perfettamente. Tuttavia, questa riga:Topshelf deve utilizzare la fabbrica di lavoro al quarzo di Autofac
cfg.UsingQuartzJobFactory(() => container.Resolve<IJobFactory>());
sembra il modo sbagliato di fare le cose. C'è un modo migliore per dire a Topshelf di usare il custom autofac? Quale ambito di vita avrà il posto di lavoro? Sono preoccupato che questa linea di codice mi causerà dei mal di testa in futuro. Come posso rilasciare la workstation quando non è più necessaria? Questa linea va bene così com'è?
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();
});
}
}
Per riferimento: TopShelf.Quartz.ScheduleHobHostConfiguratorExtensions
Riferimento: Autofac.Extras.Quartz.QuartzAutofacFactoryModule