using Autofac;
using FluentValidation;
using FluentValidation.AspNetCore;
using JSMachine.WMS.Domain.Repository;
using JSMachine.WMS.Infrastructure;
using JSMachine.WMS.Infrastructure.Helper;
using JSMachine.WMS.Job;
using JSMachine.WMS.PLC.ModbusImpl.Elevator.Exstension;
using JSMachine.WMS.WebHost.Exstention;
using JSMachine.WMS.WebHost.Filters;
using JSMachine.WMS.WebHost.Validators;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options;
using Newtonsoft.Json.Converters;
using SqlSugar;
using System.Reflection;
using System.Text.Json.Serialization;
namespace JSMachine.WMS.WebHost
{
///
/// WebHost 的服务注册和 HTTP 请求管道配置入口。
///
public class Startup
{
///
/// 创建启动配置对象。
///
/// 应用配置,包含数据库、ERP、RCS 和设备配置。
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
///
/// 注册控制器、参数验证、跨域、对象映射、缓存、数据库及应用服务所需的依赖。
///
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(op =>
{
//op.Filters.Add();
//op.Filters.Add();
op.Filters.Add();
})
.AddNewtonsoftJson(jsonOp =>
{
jsonOp.SerializerSettings.ContractResolver = null;
jsonOp.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
jsonOp.SerializerSettings.Converters.Add(new StringEnumConverter());
});
//services.AddAuthentication("Bearer")
// .AddJwtBearer("Bearer", options =>
// {
// options.Authority = Configuration["AuthorityUrl"];
// options.TokenValidationParameters = new TokenValidationParameters { ValidateAudience = false };
// options.RequireHttpsMetadata = false;
// });
//services.AddAuthorization(option =>
//{
// option.AddPolicy("DefaultPolicy", builder =>
// {
// builder.RequireAuthenticatedUser();
// builder.RequireClaim("scope", "PostOrderApi");
// });
//});
services.AddFluentValidationAutoValidation(p => p.DisableDataAnnotationsValidation = true);
services.AddValidatorsFromAssemblyContaining();
services.AddCors(option => option.AddPolicy("any", build =>
{
build
.AllowAnyHeader()
.AllowAnyOrigin()
.AllowAnyMethod();
}));
services.AddAutoMapper();
services.AddSingleton();
services.AddSingleton(s =>
{
SqlSugarScope sqlSugarScope = new(new BccDbConnectionConfig().ConnectionConfig);
sqlSugarScope.Aop.OnLogExecuting = async (sql, pars) =>
{
//await File.WriteAllTextAsync(@"C:\Users\admin\Desktop\123.txx", sql);
};
sqlSugarScope.Ado.CommandTimeOut = 5;
sqlSugarScope.Aop.OnError = error =>
{
LogHelper.Error($"操作数据库出错 {error.Message} {error.StackTrace}");
};
return sqlSugarScope;
});
}
///
/// 配置 HTTP 请求处理中间件。中间件顺序决定跨域、路由、认证授权和控制器执行时机,
/// 末尾启动后台任务及电梯 PLC 通信功能。
///
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCors("any");
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseAutoMapperConfig();
app.UseGlobalServiceProvider();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.UseAllJobs();
app.UseElevatorPlc();
}
///
/// 使用 Autofac 扫描领域、应用、业务和 RPC 程序集,注册约定命名的服务实现。
///
/// Autofac 容器构建器。
public void ConfigureContainer(ContainerBuilder builder)
{
builder
.RegisterAssemblyTypes([
Assembly.LoadFrom($"{AppDomain.CurrentDomain.BaseDirectory}JSMachine.WMS.Domain.dll"),
Assembly.LoadFrom($"{AppDomain.CurrentDomain.BaseDirectory}JSMachine.WMS.App.dll"),
Assembly.LoadFrom($"{AppDomain.CurrentDomain.BaseDirectory}JSMachine.WMS.Business.dll"),
Assembly.LoadFrom($"{AppDomain.CurrentDomain.BaseDirectory}JSMachine.WMS.RPC.dll")
])
.Where(x => x.Name.EndsWith("Repository", StringComparison.OrdinalIgnoreCase) ||
x.Name.EndsWith("Service", StringComparison.OrdinalIgnoreCase)||
x.Name.EndsWith("Strategy", StringComparison.OrdinalIgnoreCase)||
x.Name.EndsWith("Handler", StringComparison.OrdinalIgnoreCase))
.AsImplementedInterfaces()
.AsSelf()
.SingleInstance();
}
}
}