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();
}
}
}