105040 Update 添加中间件支持
This commit is contained in:
parent
9574d7e0b6
commit
ae37631d03
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
namespace LFlow.Base;
|
namespace LFlow.Base;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 程序对象
|
/// 程序对象
|
||||||
|
|
@ -10,4 +12,6 @@ public class App
|
||||||
{
|
{
|
||||||
return ServiceProvider!.GetService<T>();
|
return ServiceProvider!.GetService<T>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<Assembly> SubServiceAssembly = [];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,4 +27,8 @@
|
||||||
<Folder Include="wwwroot\" />
|
<Folder Include="wwwroot\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\LFlow.Middleware\LFlow.Middleware.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
using LFlow.Base.Interfaces;
|
using LFlow.Base.Interfaces;
|
||||||
using LFlow.Base.Utils;
|
using LFlow.Base.Utils;
|
||||||
|
using LFlow.Middleware;
|
||||||
|
using LFlow.Middleware.Register;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
using Serilog.Events;
|
using Serilog.Events;
|
||||||
using SqlSugar;
|
using SqlSugar;
|
||||||
|
|
@ -29,9 +31,11 @@ public static class Program
|
||||||
builder.Services.AddResponseCompression();
|
builder.Services.AddResponseCompression();
|
||||||
builder.Services.AddResponseCaching();
|
builder.Services.AddResponseCaching();
|
||||||
|
|
||||||
|
|
||||||
Log.Logger.Information("LoadSubService");
|
Log.Logger.Information("LoadSubService");
|
||||||
builder.Services.LoadSubService();
|
builder.Services.LoadSubService();
|
||||||
|
|
||||||
|
builder.Services.RegisterMiddlewares(App.SubServiceAssembly);
|
||||||
builder.Services.AddEndpointsApiExplorer();
|
builder.Services.AddEndpointsApiExplorer();
|
||||||
builder.Services.AddSwaggerGen();
|
builder.Services.AddSwaggerGen();
|
||||||
builder.Services.AddHttpContextAccessor();
|
builder.Services.AddHttpContextAccessor();
|
||||||
|
|
@ -75,6 +79,7 @@ public static class Program
|
||||||
// .WriteTo.Console();
|
// .WriteTo.Console();
|
||||||
}, true);
|
}, true);
|
||||||
// init App.service
|
// init App.service
|
||||||
|
|
||||||
App.services = builder.Services;
|
App.services = builder.Services;
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
app.UseSerilogRequestLogging(options =>
|
app.UseSerilogRequestLogging(options =>
|
||||||
|
|
@ -104,6 +109,8 @@ public static class Program
|
||||||
Log.Logger.Information("ApplicationStarted");
|
Log.Logger.Information("ApplicationStarted");
|
||||||
CodeFirst.InitTable();
|
CodeFirst.InitTable();
|
||||||
});
|
});
|
||||||
|
// 启用自定义中间件
|
||||||
|
app.UseLFlowMiddleware();
|
||||||
|
|
||||||
// 启用缓存
|
// 启用缓存
|
||||||
app.UseResponseCaching();
|
app.UseResponseCaching();
|
||||||
|
|
@ -159,6 +166,7 @@ public static class Program
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
bool isModule = false;
|
||||||
Log.Logger.Information($"Load file -> {file}...");
|
Log.Logger.Information($"Load file -> {file}...");
|
||||||
var assembly = Assembly.LoadFile(file);
|
var assembly = Assembly.LoadFile(file);
|
||||||
var types = assembly.GetTypes();
|
var types = assembly.GetTypes();
|
||||||
|
|
@ -174,6 +182,7 @@ public static class Program
|
||||||
Log.Logger.Information($"\tFound IModule -> {type.FullName}");
|
Log.Logger.Information($"\tFound IModule -> {type.FullName}");
|
||||||
var module = Activator.CreateInstance(type) as IModule;
|
var module = Activator.CreateInstance(type) as IModule;
|
||||||
module?.ConfigureModule(services);
|
module?.ConfigureModule(services);
|
||||||
|
isModule = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -183,6 +192,10 @@ public static class Program
|
||||||
// // 添加Controller
|
// // 添加Controller
|
||||||
// services.AddControllers().AddApplicationPart(assembly);
|
// services.AddControllers().AddApplicationPart(assembly);
|
||||||
// }
|
// }
|
||||||
|
if (isModule)
|
||||||
|
{
|
||||||
|
App.SubServiceAssembly.Add(assembly);
|
||||||
|
}
|
||||||
Log.Logger.Information("done.\r\n");
|
Log.Logger.Information("done.\r\n");
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
|
||||||
|
namespace LFlow.Middleware
|
||||||
|
{
|
||||||
|
public interface IMiddleware
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 优先级
|
||||||
|
/// </summary>
|
||||||
|
int Priority { get; }
|
||||||
|
/// <summary>
|
||||||
|
/// 入口
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context"></param>
|
||||||
|
/// <param name="next"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task RunAsync(HttpContext context, Func<Task> next);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.2" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
using LFlow.Middleware.Register;
|
||||||
|
using Microsoft.AspNetCore.Builder;
|
||||||
|
|
||||||
|
namespace LFlow.Middleware
|
||||||
|
{
|
||||||
|
public static class MiddlewareExtensions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Use LFlow Middleware
|
||||||
|
/// 配置中间件
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="app"></param>
|
||||||
|
public static async void UseLFlowMiddleware(this IApplicationBuilder app)
|
||||||
|
{
|
||||||
|
app.BuildMiddlewareServiceProvider();
|
||||||
|
await MiddlewareRegister.Handle(app);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
using Microsoft.AspNetCore.Builder;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace LFlow.Middleware.Register
|
||||||
|
{
|
||||||
|
public static class MiddlewareRegister
|
||||||
|
{
|
||||||
|
private static IServiceProvider _serviceProvider;
|
||||||
|
|
||||||
|
private static readonly IDictionary<Type, IMiddleware> _middlewares = new Dictionary<Type, IMiddleware>();
|
||||||
|
private static List<Type> _middlewareTypes = [];
|
||||||
|
public static void RegisterMiddlewares(this IServiceCollection service, List<Assembly> assemblys)
|
||||||
|
{
|
||||||
|
//var assembly = Assembly.getas()!;
|
||||||
|
assemblys.ForEach(assembly =>
|
||||||
|
{
|
||||||
|
var types = assembly.GetTypes().ToList();
|
||||||
|
foreach (var type in types)
|
||||||
|
{
|
||||||
|
if (type.GetInterface(nameof(IMiddleware)) != null)
|
||||||
|
{
|
||||||
|
service.AddSingleton(type);
|
||||||
|
_middlewareTypes.Add(type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void BuildMiddlewareServiceProvider(this IApplicationBuilder application)
|
||||||
|
{
|
||||||
|
_serviceProvider = application.ApplicationServices;
|
||||||
|
_middlewareTypes.ForEach(type =>
|
||||||
|
{
|
||||||
|
if (_serviceProvider.GetService(type) is IMiddleware middleware)
|
||||||
|
_middlewares.Add(type, middleware);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 处理中间件
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context"></param>
|
||||||
|
/// <param name="next"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static async Task Handle(IApplicationBuilder application)
|
||||||
|
{
|
||||||
|
var orderedMiddlewares = _middlewares.Values.OrderBy(m => m.Priority).ToList();
|
||||||
|
foreach (var middleware in orderedMiddlewares)
|
||||||
|
{
|
||||||
|
application.Use(middleware.RunAsync);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,15 +3,22 @@ using LFlow.Base.Utils;
|
||||||
using LFlow.UserManagement.Model;
|
using LFlow.UserManagement.Model;
|
||||||
using LFlow.UserManagement.Service;
|
using LFlow.UserManagement.Service;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Serilog;
|
||||||
|
|
||||||
namespace LFlow.UserManagement.Controller
|
namespace LFlow.UserManagement.Controller
|
||||||
{
|
{
|
||||||
public class UserManagementController(IUserManagementService service) : BaseController
|
public class UserManagementController(IUserManagementService service, ILogger logger) : BaseController
|
||||||
{
|
{
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public ApiResult<UserDto>? Login(UserDto user)
|
public ApiResult<UserDto>? Login(UserDto user)
|
||||||
{
|
{
|
||||||
return Success(service.Login(user));
|
var loginedUser = service.Login(user);
|
||||||
|
if (loginedUser == null)
|
||||||
|
{
|
||||||
|
logger.Error("登录失败,用户名或密码错误");
|
||||||
|
return Fail(loginedUser, "登录失败,用户名或密码错误", 10001);
|
||||||
|
}
|
||||||
|
return Success(loginedUser);
|
||||||
}
|
}
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public ApiResult<UserDto> Register(UserDto user)
|
public ApiResult<UserDto> Register(UserDto user)
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ namespace LFlow.UserManagement.Service
|
||||||
UserPassword = userPwd
|
UserPassword = userPwd
|
||||||
});
|
});
|
||||||
|
|
||||||
if (userModel == null)
|
if (userModel == null || !userModel.Any())
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
using LFlow.Middleware;
|
||||||
|
using Serilog;
|
||||||
|
|
||||||
|
namespace LFlow.UserManagement
|
||||||
|
{
|
||||||
|
public class UserMiddleware(ILogger logger) : IMiddleware
|
||||||
|
{
|
||||||
|
public int Priority => 1;
|
||||||
|
public async Task RunAsync(Microsoft.AspNetCore.Http.HttpContext context, Func<Task> next)
|
||||||
|
{
|
||||||
|
// Do something before
|
||||||
|
var path = context.Request.Path;
|
||||||
|
logger.Information(path);
|
||||||
|
await next();
|
||||||
|
// Do something after
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -9,7 +9,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LFlow.VersionManagement", "
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LFlow.OnlineManegement", "LFlow.OnlineManegement\LFlow.OnlineManegement.csproj", "{E849310F-64AD-453A-A2AA-557731508BF1}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LFlow.OnlineManegement", "LFlow.OnlineManegement\LFlow.OnlineManegement.csproj", "{E849310F-64AD-453A-A2AA-557731508BF1}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LFlow.UserManagement", "LFlow.UserManagement\LFlow.UserManagement.csproj", "{DA68CE22-AC53-40BD-AB2A-5C52DFDDD548}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LFlow.UserManagement", "LFlow.UserManagement\LFlow.UserManagement.csproj", "{DA68CE22-AC53-40BD-AB2A-5C52DFDDD548}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LFlow.Middleware", "LFlow.Middleware\LFlow.Middleware.csproj", "{5BFD207E-28B3-40B8-94DF-1723C6A4424B}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
|
@ -33,6 +35,10 @@ Global
|
||||||
{DA68CE22-AC53-40BD-AB2A-5C52DFDDD548}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{DA68CE22-AC53-40BD-AB2A-5C52DFDDD548}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{DA68CE22-AC53-40BD-AB2A-5C52DFDDD548}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{DA68CE22-AC53-40BD-AB2A-5C52DFDDD548}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{DA68CE22-AC53-40BD-AB2A-5C52DFDDD548}.Release|Any CPU.Build.0 = Release|Any CPU
|
{DA68CE22-AC53-40BD-AB2A-5C52DFDDD548}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{5BFD207E-28B3-40B8-94DF-1723C6A4424B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{5BFD207E-28B3-40B8-94DF-1723C6A4424B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{5BFD207E-28B3-40B8-94DF-1723C6A4424B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{5BFD207E-28B3-40B8-94DF-1723C6A4424B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue