C# Topshelf需要使用Autofac';s石英加工厂
我正在尝试将TopShelf与Quartz.net和Autofac结合使用。我下面的代码工作得很好。但是,这一行:C# Topshelf需要使用Autofac';s石英加工厂,c#,autofac,quartz.net,topshelf,C#,Autofac,Quartz.net,Topshelf,我正在尝试将TopShelf与Quartz.net和Autofac结合使用。我下面的代码工作得很好。但是,这一行: cfg.UsingQuartzJobFactory(() => container.Resolve<IJobFactory>()); cfg.UsingQuartzJobFactory(()=>container.Resolve()); 似乎是做事情的错误方式。有没有更好的方法告诉Topshelf使用定制autofac jobfactory?jobfactor
cfg.UsingQuartzJobFactory(() => container.Resolve<IJobFactory>());
cfg.UsingQuartzJobFactory(()=>container.Resolve());
似乎是做事情的错误方式。有没有更好的方法告诉Topshelf使用定制autofac jobfactory?jobfactory的生命周期范围是什么?我担心这行代码将来会给我带来一些麻烦。当不再需要jobfactory时,如何释放它?这条线还可以吗
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();
});
}
}
类轮询器:IJob
{
私有只读ILogger_日志;
公共民意调查(ILogger日志)
{
_log=log;
_log.Info(“实例化…”);
}
public void Execute(IJobExecutionContext上下文)
{
_log.Info(“正在执行…”);
}
}
班级计划
{
静态Autofac.IContainer BuildContainer()
{
var builder=new ContainerBuilder();
builder.RegisterModule();
builder.RegisterModule();
builder.RegisterModule(新的QuartzAutofacJobsModule(typeof(Poller.Assembly));
var container=builder.Build();
返回容器;
}
静态void Main(字符串[]参数)
{
var container=BuildContainer();
HostFactory.Run(cfg=>
{
cfg.UseNLog();
cfg.useautofacainer(容器);
cfg.SetDescription(“说明”);
SetDisplayName(“显示”);
cfg.SetServiceName(“名称”);
使用quartzjobFactory(()=>container.Resolve());
cfg.scheduleQuartzJobaService(q=>
{
q、 WithJob(()=>JobBuilder.Create().Build());
q、 AddTrigger(()=>TriggerBuilder.Create().WithSimpleSchedule(b=>b.WithIntervalInSeconds(20.RepeatForever()).Build());
});
cfg.StartAutomatically();
cfg.RunAsLocalSystem();
});
}
}
供参考:
另请参考:我认为您应该使用容器初始化quartz服务器,本例使用unity,但我确信它可以用于其他容器
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:
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) {
}
}
关于JobFactory的生命周期,不要担心。来自Quartz文档:
“JobFactory只激活job类的新实例。您可能希望创建自己的JobFactory实现,以完成诸如让应用程序的IoC或DI容器生成/初始化job实例之类的任务”