using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.OpenApi.Models; using Newtonsoft.Json.Serialization; using Quartz; using System; using System.Collections.Generic; using System.IO; using System.Text; using WMS.Web.Core.Help; using WMS.Web.Domain.IService; using WMS.Web.Domain.IService.Public; using WMS.Web.Domain.Mappers; using WMS.Web.Domain.Options; using WMS.Web.Domain.QuartzJob; using WMS.Web.Domain.Services; using WMS.Web.Domain.Services.Public; namespace WMS.Web.Repositories.DependencyInjection { /// /// App服务 /// public class AppBuilder { /// /// 服务集合 /// public IServiceCollection Services { get; } public IConfiguration Configuration { get; } public IWebHostEnvironment WebHostEnvironment { get; } /// /// asf 服务 /// /// public AppBuilder(IServiceCollection services, IConfiguration configuration, IWebHostEnvironment webHostEnvironment) { Services = services; Configuration = configuration; WebHostEnvironment = webHostEnvironment; } /// /// 编译服务 /// public void Build() { this.AddCors(); this.InitRedis(); this.AddSwagger(); this.AddOther(); this.AddConfigOptions(); this.AddServiceRepositories(); this.AddQuartzService(); } /// /// 其它功能注入:AutoMapper等其它 /// private void AddOther() { Services.AddMvc().AddNewtonsoftJson(opt => { //// 忽略循环引用 //opt.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; opt.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); //// 不使用驼峰 //opt.SerializerSettings.ContractResolver = new DefaultContractResolver(); }); //AutoMapper映射关系 Services.AddAutoMapper(typeof(AppMapper).Assembly); } /// /// 跨域注入 /// private void AddCors() { // 全局跨域注入 Services.AddCors(opt => { string[] urls = Configuration.GetSection("AllowedCores").Value.Split(','); opt.AddPolicy("AllowAllOrigin", builder => { builder.AllowAnyMethod() .AllowAnyHeader() .AllowCredentials() .WithOrigins(urls); }); }); } /// /// 初始化redis /// private void InitRedis() { var option = Configuration.GetSection("AppOptions").Get(); var option_soa = Configuration.GetSection("SoaOptions").Get(); //初始化redis RedisClient.redisClient.InitConnect(option.RedisConnectionString); Services.AddHttpClient("ops_client", c => { c.BaseAddress = new Uri(option_soa.Url); }); } /// /// 注册swagger /// private void AddSwagger() { if (WebHostEnvironment.IsDevelopment()) { // 注册Swagger服务 Services.AddSwaggerGen(c => { // 添加文档信息 c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "WMS", Version = "v1", Description = "WMS-Api" }); #region 读取xml信息 // 使用反射获取xml文件。并构造出文件的路径 //// 启用xml注释. 该方法第二个参数启用控制器的注释,默认为false. foreach (var file in Directory.GetFiles(AppContext.BaseDirectory, "WMS.*.xml")) c.IncludeXmlComments(file, true); #endregion #region 启用swagger验证功能 //添加一个必须的全局安全信息,和AddSecurityDefinition方法指定的方案名称一致即可,CoreAPI。 var securit = new OpenApiSecurityRequirement() { { new OpenApiSecurityScheme { Reference=new OpenApiReference { Type=ReferenceType.SecurityScheme,Id= "WMSAPI" } }, new string[] { } } }; c.AddSecurityRequirement(securit); c.AddSecurityDefinition("WMSAPI", new OpenApiSecurityScheme { Description = "JWT授权(数据将在请求头中进行传输) 在下方输入Bearer {token} 即可", Name = "Authorization",//jwt默认的参数名称 In = ParameterLocation.Header,//jwt默认存放Authorization信息的位置(请求头中) Type = SecuritySchemeType.ApiKey }); #endregion }); } } /// /// 系统配置 /// private void AddConfigOptions() { //系统配置注册 Services.AddOptions(); Services.Configure(Configuration.GetSection("AppOptions")); Services.AddOptions(); Services.Configure(Configuration.GetSection("SoaOptions")); Services.AddOptions(); Services.Configure(Configuration.GetSection("HttpOptions")); Services.AddOptions(); Services.Configure(Configuration.GetSection("ErpOptions")); Services.AddOptions(); Services.Configure(Configuration.GetSection("OpsOptions")); Services.AddOptions(); Services.Configure(Configuration.GetSection("Qiniu")); } /// /// Quartz定时任务-可分布式集群 /// private void AddQuartzService() { var options = Configuration.GetSection("QuartzJobOptions").Get(); Services.AddTransient();//添加注入定时服务 Services.AddTransient();//添加注入定时服务 Services.AddTransient();//添加注入定时服务 //Services.AddTransient();//添加注入定时服务 Services.AddQuartz(q => { q.UsePersistentStore(x => { //存储类型 x.Properties[options.JobStoreTypeKey] = options.JobStoreTypeValue; //数据库驱动类型-这里是mysql x.Properties[options.JobStoreDriverDelegateTypeKey] = options.JobStoreDriverDelegateTypeValue; //表名前缀 x.Properties[options.JobStoreTablePrefixKey] = options.JobStoreTablePrefixValue; //数据源名称 x.Properties[options.JobStoreDataSourceKey] = options.JobStoreDataSourceValue; //连接字符串 x.Properties[options.JobStoreConnectionStringKey] = options.JobStoreConnectionStringValue; //sqlserver版本 x.Properties[options.JobStoreProviderKey] = options.JobStoreProviderValue; //是否启用集群:是 x.Properties[options.JobStoreClusteredKey] = options.JobStoreClusteredValue; //集群节点都必须有一个唯一ID x.Properties[options.JobStoreInstanceIdKey] = options.JobStoreInstanceIdValue; x.UseProperties = true; x.UseClustering(); x.UseJsonSerializer(); }); //用于注入 q.UseMicrosoftDependencyInjectionJobFactory(); #region 获取金蝶单据数据定时-配置 var jobKey = new JobKey("InStockOrderQuartzJob", options.QuartzJobValue); q.AddJob(jobKey, j => j.WithDescription("InStockOrderQuartzJob")); q.AddTrigger(t => t .WithIdentity("InStockOrderQuartzJobTrigger") .ForJob(jobKey) .StartNow() .WithCronSchedule(options.JobStartExpre) //.WithCronSchedule(CronScheduleBuilder.DailyAtHourAndMinute(options.JobStartHour[5], options.JobStartMinute[5])) .WithDescription("InStockOrderQuartzJobTriggerDecs")); #endregion #region 出库任务单 var jobKey_out = new JobKey("OutStockOrderQuartzJob", options.QuartzJobValue); q.AddJob(jobKey_out, j => j.WithDescription("OutStockOrderQuartzJob")); q.AddTrigger(t => t .WithIdentity("OutStockOrderQuartzJobTrigger") .ForJob(jobKey_out) .StartNow() .WithCronSchedule(options.JobStartExpre) //.WithCronSchedule(CronScheduleBuilder.DailyAtHourAndMinute(options.JobStartHour[5], options.JobStartMinute[5])) .WithDescription("OutStockOrderQuartzJobTriggerDecs")); #endregion #region 箱信息老ops var jobKey_box = new JobKey("BoxQuartzJob", options.QuartzJobValue); q.AddJob(jobKey_box, j => j.WithDescription("BoxQuartzJob")); q.AddTrigger(t => t .WithIdentity("BoxQuartzJobTrigger") .ForJob(jobKey_box) .StartNow() .WithCronSchedule(options.JobStartExpre) //.WithCronSchedule(CronScheduleBuilder.DailyAtHourAndMinute(options.JobStartHour[5], options.JobStartMinute[5])) .WithDescription("BoxQuartzJobTriggerDecs")); #endregion }); //.net core核心托管-添加Quartz服务器 Services.AddQuartzServer(options => { //关闭时,我们希望作业正常完成 options.WaitForJobsToComplete = false; }); } /// /// 注入服务层 /// /// private void AddServiceRepositories() { Services.AddSingleton(); Services.AddTransient(); //注入服务 Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); } } }