Ich versuche, Quartz.net (2.1.2) mit einem IoC-Container (Autofac) zu arbeiten, da ich Dienste habe, die ich im geplanten verwenden muss Arbeitsplätze. Ich habe ähnliche Beiträge zu diesem Thema gefunden, aber ich kann keine mit einem spezifischen Registrierungsbeispiel für Autofac finden.Wie erstelle ich einen Job von Quartz.NET, der eine Injektion mit Autofac benötigt
Die folgende Beitrag befasst sich mit dem gleichen Problem das ich habe:
How to schedule task using Quartz.net 2.0?
der Teil I ich bin fehlt, ist jedoch der Meinung, wenn die Antwort sagt: „Und vergessen Sie nicht, den Job in registrieren der IoC-Container ". Ich bin mir nicht sicher, wie ich das genau machen soll, da alles, was ich bisher versucht habe, nicht funktioniert hat.
Im folgenden Beispiel wird "HelloJob" ausgeführt, aber wenn ich versuche, den releaseService in den "ReleaseJob" zu injizieren, weigert er sich zu laufen.
Update: I markiert den Code in der DependencyRegistration.cs wo ich glaube, das Problem ist.
Update 2: einige relevante Links, die auf verwandt sind, was ich tun müssen, und könnte helfen (Ich habe bereits durch sie gegangen alle, aber immer noch nicht herausfinden können, wie dies mit Autofac zum Laufen zu bringen):
Wie verwendet man Quartz.NET in PRO-Weise? - http://blog.goyello.com/2009/09/21/how-to-use-quartz-net-in-pro-way/
Autofac und Quartz.NET - http://blog.humann.info/post/2013/01/30/Autofac-and-QuartzNET.aspx
Constructor Injektion mit Quartz.NET und einfachen Injector - Constructor injection with Quartz.NET and Simple Injector
ASP.Net MVC 3, Ninject und Quarz .Net - Wie? - ASP.Net MVC 3, Ninject and Quartz.Net - How to?
Hier ist der relevante Code:
Global.asax
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
var dependencyRegistration = new DependencyRegistration();
dependencyRegistration.Register();
ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(new ValidatorFactory()));
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
}
DependencyRegistration.cs
public class DependencyRegistration
{
public void Register()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly());
// Validation
builder.RegisterType<ValidatorFactory>()
.As<IValidatorFactory>()
.InstancePerHttpRequest();
AssemblyScanner findValidatorsInAssembly = AssemblyScanner.FindValidatorsInAssembly(Assembly.GetExecutingAssembly());
foreach (AssemblyScanner.AssemblyScanResult item in findValidatorsInAssembly)
{
builder.RegisterType(item.ValidatorType)
.As(item.InterfaceType)
.InstancePerHttpRequest();
}
// Schedule
builder.Register(x => new StdSchedulerFactory().GetScheduler()).As<IScheduler>();
// Schedule jobs
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).Where(x => typeof(IJob).IsAssignableFrom(x));
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
//Schedule
IScheduler sched = container.Resolve<IScheduler>();
sched.JobFactory = new AutofacJobFactory(container);
sched.Start();
IJobDetail job = JobBuilder.Create<ReleaseJob>()
.WithIdentity("1Job")
.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("1JobTrigger")
.WithSimpleSchedule(x => x
.RepeatForever()
.WithIntervalInSeconds(5)
)
.StartNow()
.Build();
sched.ScheduleJob(job, trigger);
job = JobBuilder.Create<HelloJob>()
.WithIdentity("2Job")
.Build();
trigger = TriggerBuilder.Create()
.WithIdentity("2JobTrigger")
.WithSimpleSchedule(x => x
.RepeatForever()
.WithIntervalInSeconds(5)
)
.StartNow()
.Build();
sched.ScheduleJob(job, trigger);
}
}
JobFactory.cs
public class AutofacJobFactory : IJobFactory
{
private readonly IContainer _container;
public AutofacJobFactory(IContainer container)
{
_container = container;
}
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return (IJob)_container.Resolve(bundle.JobDetail.JobType);
}
public void ReturnJob(IJob job)
{
}
}
ReleaseJob.cs
public class ReleaseJob : IJob
{
private readonly IReleaseService _releaseService;
public ReleaseJob(IReleaseService releaseService)
{
this._releaseService = releaseService;
}
public void Execute(IJobExecutionContext context)
{
Debug.WriteLine("Release running at " + DateTime.Now.ToString());
}
}
public class HelloJob : IJob
{
public void Execute(IJobExecutionContext context)
{
Debug.WriteLine("Hello job at " + DateTime.Now.ToString());
}
}
ReleaseServiceModel.cs
public class ReleaseServiceModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<ReleaseService>()
.As<IReleaseService>()
.InstancePerLifetimeScope();
}
}
Sie haben mir die Zeit gerettet, dies herauszufinden. Vielen Dank Tomas. – slashp