填充项目

This commit is contained in:
zpc 2024-06-11 18:19:18 +08:00
parent d355e53c3d
commit 64c4ed3248
14 changed files with 562 additions and 5 deletions

View File

@ -0,0 +1,26 @@
namespace HuanMeng.DotNetCore.Base
{
public class BLLBase<TDao> where TDao : DaoBase
{
/// <summary>
/// _serviceProvider,提供基本依赖注入支持
/// </summary>
protected readonly IServiceProvider _serviceProvider;
/// <summary>
/// _dao,提供数据访问支持
/// </summary>
protected readonly TDao _dao;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="serviceProvider"></param>
/// <param name="dao"></param>
public BLLBase(IServiceProvider serviceProvider, TDao dao)
{
_serviceProvider = serviceProvider;
_dao = dao;
}
}
}

View File

@ -0,0 +1,89 @@
using System.Runtime.Serialization;
using XLib.DotNetCore.Base;
namespace HuanMeng.DotNetCore.Base
{
/// <summary>
/// 接口和服务调用基础响应类
/// </summary>
/// <typeparam name="T"></typeparam>
[DataContract]
[Serializable]
public class BaseResponse<T> : IResponse
{
///// <summary>
///// Http状态码
///// </summary>
//[DataMember]
//public HttpStatusCode StatusCode { get; set; }
/// <summary>
/// 功能执行返回代码
/// </summary>
[DataMember]
public int Code { get; set; }
/// <summary>
/// 消息
/// </summary>
[DataMember]
public string Message { get; set; }
/// <summary>
/// 数据
/// </summary>
[DataMember]
public T Data { get; set; }
/// <summary>
/// 构造函数
/// </summary>
public BaseResponse()
{
//StatusCode = HttpStatusCode.OK;
Code = 0;
Message = "";
}
/// <summary>
/// 构造函数
/// </summary>
public BaseResponse(int code, string message)
{
Code = code;
Message = message;
Data = default(T);
}
/// <summary>
/// 构造函数
/// </summary>
public BaseResponse(int code, string message, T data)
{
Code = code;
Message = message;
Data = data;
}
/// <summary>
/// 构造函数
/// </summary>
public BaseResponse(ResonseCode code, string message, T data)
{
Code = (int)code;
Message = message;
Data = data;
}
/// <summary>
/// ToString
/// </summary>
/// <returns></returns>
public override string ToString()
{
return $"Code:{Code};Message:{Message}; Data:{Data}";
}
}
}

View File

@ -0,0 +1,32 @@
namespace HuanMeng.DotNetCore.Base
{
public class DaoBase
{
/// <summary>
/// _serviceProvider,提供基本依赖注入支持
/// </summary>
protected readonly IServiceProvider _serviceProvider;
///// <summary>
///// 构造函数
///// </summary>
//public DaoBase()
//{
// // 创建一个空的ServiceCollection
// var webApplication = WebApplication.Current;
// var services = new ServiceCollection();
// // 创建ServiceProvider实例
// _serviceProvider = services.BuildServiceProvider();
//}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="serviceProvider"></param>
public DaoBase(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
}
}

View File

@ -0,0 +1,23 @@
namespace XLib.DotNetCore.Base
{
/// <summary>
/// 接口和服务调用通用响应接口
/// </summary>
public interface IResponse
{
///// <summary>
///// Http状态码
///// </summary>
//HttpStatusCode StatusCode { get; set; }
/// <summary>
/// 功能执行返回代码
/// </summary>
int Code { get; set; }
/// <summary>
/// 消息
/// </summary>
string Message { get; set; }
}
}

View File

@ -0,0 +1,49 @@
namespace HuanMeng.DotNetCore.Base
{
/// <summary>
/// 响应编码参考,实际的项目使用可以自行定义
/// 基本规则:
/// 成功大于等于0
/// 失败小于0
/// </summary>
public enum ResonseCode
{
/// <summary>
/// Sign签名错误
/// </summary>
SignError = -999,
/// <summary>
/// jwt用户签名错误
/// </summary>
TwtError = -998,
/// <summary>
/// 用户验证失败
/// </summary>
Unauthorized = 401,
/// <summary>
/// 正在处理中
/// </summary>
Processing = 102,
/// <summary>
/// 通用错误
/// </summary>
Error = -1,
/// <summary>
/// 参数错误
/// </summary>
ParamError = -2,
/// <summary>
/// 没找到数据记录
/// </summary>
NotFoundRecord = -3,
/// <summary>
/// 成功
/// </summary>
Success = 0,
}
}

View File

@ -0,0 +1,15 @@
<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.Logging.Abstractions" Version="8.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,56 @@
using HuanMeng.DotNetCore.Base;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace HuanMeng.DotNetCore.MiddlewareExtend
{
/// <summary>
/// 异常中间件
/// </summary>
public class ExceptionMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<ExceptionMiddleware> _logger;
public ExceptionMiddleware(RequestDelegate next, ILogger<ExceptionMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task Invoke(HttpContext context)
{
try
{
await _next(context);
}
catch (ArgumentNullException ex)
{
context.Response.StatusCode = StatusCodes.Status200OK;
BaseResponse<object> baseResponse = new BaseResponse<object>(ResonseCode.ParamError, ex.ParamName ?? "参数错误", null)
{
};
context.Response.ContentType = "application/json; charset=utf-8";
// 将异常信息写入 HTTP 响应
await context.Response.WriteAsync(JsonConvert.SerializeObject(baseResponse));
}
catch (Exception ex)
{
_logger.LogError(context.Request.Path.ToString(), ex, "异常记录");
// 设置 HTTP 响应状态码为 500
context.Response.ContentType = "application/json; charset=utf-8";
context.Response.StatusCode = StatusCodes.Status200OK;
BaseResponse<object> baseResponse = new BaseResponse<object>(ResonseCode.Error, ex.Message, null);
// 将异常信息写入 HTTP 响应
await context.Response.WriteAsync(JsonConvert.SerializeObject(baseResponse));
}
finally
{
}
}
}
}

View File

@ -0,0 +1,26 @@
using Microsoft.AspNetCore.Http;
using System.Diagnostics;
namespace HuanMeng.DotNetCore.MiddlewareExtend
{
/// <summary>
/// 方法执行时间
/// </summary>
public class ExecutionTimeMiddleware(RequestDelegate _next)
{
public async Task Invoke(HttpContext context)
{
// 开始计时
var sw = Stopwatch.StartNew();
//在将响应标头发送到之前添加要调用的委托客户此处注册的回调按相反顺序运行。
context.Response.OnStarting(() =>
{
sw.Stop();
context.Response.Headers.TryAdd("X-Request-Duration", $"{sw.Elapsed.TotalMilliseconds} ms");
return Task.CompletedTask;
});
await _next(context);
}
}
}

View File

@ -0,0 +1,29 @@
using Microsoft.AspNetCore.Builder;
namespace HuanMeng.DotNetCore.MiddlewareExtend
{
/// <summary>
/// 中间库扩展
/// </summary>
public static class MiddlewareExtends
{
/// <summary>
/// 异常中间件
/// </summary>
/// <param name="builder"></param>
/// <returns></returns>
public static IApplicationBuilder UseExecutionTimeMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<ExecutionTimeMiddleware>();
}
/// <summary>
/// 执行时间中间件
/// </summary>
/// <param name="builder"></param>
/// <returns></returns>
public static IApplicationBuilder UseExceptionMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<ExceptionMiddleware>();
}
}
}

View File

@ -0,0 +1,58 @@

namespace HuanMeng.DotNetCore.Processors
{
/// <summary>
/// 任务处理器
/// </summary>
public abstract class BaseProcessor : ITaskProcessor
{
/// <summary>
/// 终止内部处理线程的最长等待时间(毫秒)
/// </summary>
protected const int WaitTimeMax_StopProc = 20000;
/// <summary>
/// 构造函数
/// </summary>
public BaseProcessor()
{
//加载配置
LoadSettings();
}
/// <summary>
/// 加载配置
/// </summary>
protected virtual void LoadSettings()
{
//初始化
// LogHelper.Info("BaseProcessor.LoadSettings");
}
/// <summary>
/// Dispose
/// </summary>
public virtual void Dispose()
{
}
/// <summary>
/// 执行任务
/// </summary>
public virtual void Run()
{
//LogHelper.Info("BaseProcessor.Run");
}
/// <summary>
/// 停止执行任务
/// </summary>
public virtual void Stop()
{
// LogHelper.Info("BaseProcessor.Stop");
}
}
}

View File

@ -0,0 +1,18 @@
namespace HuanMeng.DotNetCore.Processors
{
/// <summary>
/// 任务处理器接口
/// </summary>
public interface ITaskProcessor : IDisposable
{
/// <summary>
/// 运行任务
/// </summary>
void Run();
/// <summary>
/// 停止运行
/// </summary>
void Stop();
}
}

View File

@ -0,0 +1,122 @@
namespace HuanMeng.DotNetCore.Processors
{
/// <summary>
/// 包含处理线程的Processor
/// </summary>
public abstract class ThreadProcessor : BaseProcessor
{
/// <summary>
/// 处理线程
/// </summary>
protected Thread? _thread = null;
/// <summary>
/// 是否运行处理器
/// </summary>
protected bool _isRunProc = true;
/// <summary>
/// 构造函数
/// </summary>
public ThreadProcessor()
{
}
/// <summary>
/// 执行处理
/// </summary>
public override void Run()
{
try
{
_isRunProc = true;
_thread = new Thread(new ThreadStart(Proc_Do));
_thread.Start();
// LogHelper.Info($"ThreadProcessor.Run已执行");
}
catch (Exception ex)
{
// LogHelper.Error($"ThreadProcessor.Run,error", ex);
}
}
/// <summary>
/// 线程处理函数
/// </summary>
protected abstract void Proc_Do();
//{
// LogHelper.Info($"ThreadProcessor.Proc_Do已执行");
// ////demo
// ////处理流程
// //while (_isRunProc)
// //{
// // try
// // {
// // //DoProeess();
// // //简单示例Sleep
// // Thread.Sleep(10000);
// // }
// // catch (Exception ex)
// // {
// // LogHelper.Error("ThreadProcessor.Proc_Do,DoProeess异常", ex);
// // }
// //}
//}
//demo
///// <summary>
///// 执行流程处理
///// </summary>
//protected virtual void DoProeess()
//{
// //简单示例
// try
// {
// //简单示例Sleep
// Thread.Sleep(10000);
// }
// catch (Exception ex)
// {
// LogHelper.Error("ThreadProcessor.Proc_Do,异常", ex);
// }
//}
/// <summary>
/// 停止处理线程
/// </summary>
public override void Stop()
{
//加快停止服务的速度,可以用任务执行,不等待结束
//Task.Run(() =>
//{
_isRunProc = false;
//等待完成停止
if (_thread != null && _thread.IsAlive)
{
_thread.Join(WaitTimeMax_StopProc); //等待线程结束
_thread = null;
}
// LogHelper.Info($"ThreadProcessor.Stop已执行");
//});
}
/// <summary>
/// Dispose
/// </summary>
public override void Dispose()
{
//停止处理线程
_isRunProc = false;
this.Stop();
base.Dispose();
}
}
}

View File

@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.10.34916.146
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassLibrary1", "ClassLibrary1\ClassLibrary1.csproj", "{00597C73-22E6-435E-B6D2-688177A703DC}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HuanMeng.Model", "HuanMeng.Model\HuanMeng.Model.csproj", "{96AA1BD6-E279-4DEA-90C1-6124710E480F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HuanMeng.DotNetCore", "HuanMeng.DotNetCore\HuanMeng.DotNetCore.csproj", "{CCE9E3F9-75DF-4422-A5FD-6B8DBA21B03F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -11,10 +13,14 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{00597C73-22E6-435E-B6D2-688177A703DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{00597C73-22E6-435E-B6D2-688177A703DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{00597C73-22E6-435E-B6D2-688177A703DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{00597C73-22E6-435E-B6D2-688177A703DC}.Release|Any CPU.Build.0 = Release|Any CPU
{96AA1BD6-E279-4DEA-90C1-6124710E480F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{96AA1BD6-E279-4DEA-90C1-6124710E480F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{96AA1BD6-E279-4DEA-90C1-6124710E480F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{96AA1BD6-E279-4DEA-90C1-6124710E480F}.Release|Any CPU.Build.0 = Release|Any CPU
{CCE9E3F9-75DF-4422-A5FD-6B8DBA21B03F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CCE9E3F9-75DF-4422-A5FD-6B8DBA21B03F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CCE9E3F9-75DF-4422-A5FD-6B8DBA21B03F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CCE9E3F9-75DF-4422-A5FD-6B8DBA21B03F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE