simple injector example container c# .net dependency-injection quartz.net simple-injector

container - simple injector c# example



Inyección de constructor con Quartz.NET y Simple Injector (2)

Actualmente estoy escribiendo un servicio usando Quartz.NET para programar el funcionamiento del mismo.

Me preguntaba si alguien tiene experiencia en el uso de la inyección de constructor con Quartz.NET y Simple Injector.

Debajo está esencialmente lo que deseo alcanzar

public class JobImplementation: IJob { private readonly IInjectedClass injectedClass; public JobImplementation(IInjectedClass _injectedClass) { injectedClass = _injectedClass } public void Execute(IJobExecutionContext _context) { //Job code }


De acuerdo con esta publicación del blog , necesitaría implementar una IJobFactory personalizada, como esta:

public class SimpleInjectorJobFactory : IJobFactory { private readonly Container container; private readonly Dictionary<Type, InstanceProducer> jobProducers; public SimpleInjectorJobFactory( Container container, params Assembly[] assemblies) { this.container = container; // By creating producers, jobs can be decorated. var transient = Lifestyle.Transient; this.jobProducers = container.GetTypesToRegister(typeof(IJob), assemblies).ToDictionary( type => type, type => transient.CreateProducer(typeof(IJob), type, container)); } public IJob NewJob(TriggerFiredBundle bundle, IScheduler _) { var jobProducer = this.jobProducers[bundle.JobDetail.JobType]; return new AsyncScopedJobDecorator( this.container, () => (IJob)jobProducer.GetInstance()); } public void ReturnJob(IJob job) { // This will be handled automatically by Simple Injector } private sealed class AsyncScopedJobDecorator : IJob { private readonly Container container; private readonly Func<IJob> decorateeFactory; public AsyncScopedJobDecorator( Container container, Func<IJob> decorateeFactory) { this.container = container; this.decorateeFactory = decorateeFactory; } public async Task Execute(IJobExecutionContext context) { using (AsyncScopedLifestyle.BeginScope(this.container)) { var job = this.decorateeFactory(); await job.Execute(context); } } } }

Además, necesitarás los siguientes registros:

var container = new Container(); container.Options.ScopedLifestyle = new AsyncScopedLifestyle(); var factory = new StdSchedulerFactory(); IScheduler scheduler = await factory.GetScheduler(); scheduler.JobFactory = new SimpleInjectorJobFactory( container, Assembly.GetExecutingAssembly()); // assemblies that contain jobs // Optional: register some decorators container.RegisterDecorator(typeof(IJob), typeof(LoggingJobDecorator)); container.Verify();


Tarde en la fiesta, pero https://github.com/hbiarge/Quartz.Unity funciona bien para combinar Quartz.NET y Unity.

IUnityContainer container = new UnityContainer(); container.AddNewExtension<Quartz.Unity.QuartzUnityExtension>(); // do your other Unity registrations IScheduler scheduler = container.Resolve<IScheduler>(); scheduler.ScheduleJob( new JobDetailImpl(myCommandName, typeof(MyCommand)), TriggerBuilder.Create() .WithCronSchedule(myCronSchedule) .StartAt(startTime) .Build() ); scheduler.Start();