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