ServiceCollectionExtensions.cs 3.46 KB
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Quartz.AspNetCore.Logging;
using Quartz.Impl;
using Quartz.Logging;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;

namespace Quartz.AspNetCore
{
	public static class ServiceCollectionExtensions
	{
		public static IServiceCollection AddQuartz(this IServiceCollection services,
			Action<QuartzOtpionsBuilder> optionsAction = null)
		{
			var builder = new QuartzOtpionsBuilder { Services = services };
			builder.Properties = new NameValueCollection
			{
				{ "quartz.jobStore.useProperties", "true" }
			};
			optionsAction?.Invoke(builder);

			var serverSched = new StdSchedulerFactory(builder.Properties).GetScheduler().Result;
			builder.Services.AddSingleton(serverSched);
			//注册ISchedulerFactory的实例。
			builder.Services.AddTransient<ISchedulerFactory, StdSchedulerFactory>();
            builder.Services.AddTransient<LoggingProvider>();
            return services;
		}

		public static QuartzOtpionsBuilder UseSchedulerName(this QuartzOtpionsBuilder builder, string name)
		{
			builder.Properties.Set("schedName", name);
			return builder;
		}

		public static QuartzOtpionsBuilder UseMemoryStore(this QuartzOtpionsBuilder builder)
		{
			builder.Properties.Set("quartz.jobStore.type", "Quartz.Simpl.RAMJobStore, Quartz");
			builder.Properties.Remove("quartz.jobStore.useProperties");
			builder.Properties.Remove("quartz.jobStore.driverDelegateType");
			builder.Properties.Remove("quartz.jobStore.dataSource");
			builder.Properties.Remove("quartz.jobStore.tablePrefix");
			builder.Properties.Remove("quartz.dataSource.myDs.provider");
			builder.Properties.Remove("quartz.dataSource.myDs.connectionString");
			return builder;
		}

		public static QuartzOtpionsBuilder UseSqlServer(this QuartzOtpionsBuilder builder, string connectString, string serializerType = "binary", string tablePrefix = "QRTZ_")
		{
			builder.Properties.Set("quartz.jobStore.type", "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz");
			builder.Properties.Set("quartz.jobStore.driverDelegateType", "Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz");
			builder.Properties.Set("quartz.jobStore.dataSource", "myDs");
			builder.Properties.Set("quartz.dataSource.myDs.provider", "SqlServer");
			builder.Properties.Set("quartz.jobStore.tablePrefix", tablePrefix);
			builder.Properties.Set("quartz.serializer.type", serializerType);
			builder.Properties.Set("quartz.dataSource.myDs.connectionString", connectString);
			return builder;
		}

        public static QuartzOtpionsBuilder UseProperties(this QuartzOtpionsBuilder builder, bool useProperties)
        {
            if(useProperties)
                builder.Properties.Set("quartz.jobStore.useProperties", "true");
            else
                builder.Properties.Set("quartz.jobStore.useProperties", "false");
            return builder;
        }

        public static IServiceProvider UseQuartz(this IServiceProvider provider)
		{
			LogProvider.SetCurrentLogProvider(provider.GetRequiredService<LoggingProvider>());
			var sched = provider.GetRequiredService<IScheduler>();
			sched.Start();
			return provider;
		}

		public static IApplicationBuilder UseQuartz(this IApplicationBuilder builder)
		{
			LogProvider.SetCurrentLogProvider(builder.ApplicationServices.GetRequiredService<LoggingProvider>());
			var sched = builder.ApplicationServices.GetRequiredService<IScheduler>();
			sched.Start();
			return builder;
		}
	}
}