refactor: ai+人工重构优化 framework
This commit is contained in:
@@ -6,8 +6,21 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace Yi.Framework.Core.Data
|
||||
{
|
||||
/// <summary>
|
||||
/// 排序接口
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 实现此接口的实体类将支持排序功能
|
||||
/// 通常用于列表数据的展示顺序控制
|
||||
/// </remarks>
|
||||
public interface IOrderNum
|
||||
{
|
||||
/// <summary>
|
||||
/// 排序号
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 数字越小越靠前,默认为0
|
||||
/// </remarks>
|
||||
int OrderNum { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,8 +6,21 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace Yi.Framework.Core.Data
|
||||
{
|
||||
/// <summary>
|
||||
/// 状态接口
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 实现此接口的实体类将支持启用/禁用状态管理
|
||||
/// 用于控制数据记录的可用状态
|
||||
/// </remarks>
|
||||
public interface IState
|
||||
{
|
||||
public bool State { get; set; }
|
||||
/// <summary>
|
||||
/// 状态标识
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// true表示启用,false表示禁用
|
||||
/// </remarks>
|
||||
bool State { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,14 +7,37 @@ using System.Threading.Tasks;
|
||||
namespace Yi.Framework.Core.Enums
|
||||
{
|
||||
/// <summary>
|
||||
/// 定义公共文件路径
|
||||
/// 文件类型枚举
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 用于定义系统支持的文件类型分类
|
||||
/// 主要用于文件上传和存储时的类型区分
|
||||
/// </remarks>
|
||||
public enum FileTypeEnum
|
||||
{
|
||||
file,
|
||||
image,
|
||||
thumbnail,
|
||||
excel,
|
||||
temp
|
||||
/// <summary>
|
||||
/// 普通文件
|
||||
/// </summary>
|
||||
file = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 图片文件
|
||||
/// </summary>
|
||||
image = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 缩略图文件
|
||||
/// </summary>
|
||||
thumbnail = 2,
|
||||
|
||||
/// <summary>
|
||||
/// Excel文件
|
||||
/// </summary>
|
||||
excel = 3,
|
||||
|
||||
/// <summary>
|
||||
/// 临时文件
|
||||
/// </summary>
|
||||
temp = 4
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,9 +6,23 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace Yi.Framework.Core.Enums
|
||||
{
|
||||
/// <summary>
|
||||
/// 排序方向枚举
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 用于定义数据查询时的排序方向
|
||||
/// 常用于列表数据排序
|
||||
/// </remarks>
|
||||
public enum OrderByEnum
|
||||
{
|
||||
Asc,
|
||||
Desc
|
||||
/// <summary>
|
||||
/// 升序排列
|
||||
/// </summary>
|
||||
Asc = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 降序排列
|
||||
/// </summary>
|
||||
Desc = 1
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,67 +6,91 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace Yi.Framework.Core.Enums
|
||||
{
|
||||
/// <summary>
|
||||
/// 查询操作符枚举
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 定义查询条件中支持的操作符类型
|
||||
/// 用于构建动态查询条件
|
||||
/// </remarks>
|
||||
public enum QueryOperatorEnum
|
||||
{
|
||||
/// <summary>
|
||||
/// 相等
|
||||
/// 等于
|
||||
/// </summary>
|
||||
Equal,
|
||||
Equal = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 匹配
|
||||
/// 模糊匹配
|
||||
/// </summary>
|
||||
Like,
|
||||
Like = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 大于
|
||||
/// </summary>
|
||||
GreaterThan,
|
||||
GreaterThan = 2,
|
||||
|
||||
/// <summary>
|
||||
/// 大于或等于
|
||||
/// </summary>
|
||||
GreaterThanOrEqual,
|
||||
GreaterThanOrEqual = 3,
|
||||
|
||||
/// <summary>
|
||||
/// 小于
|
||||
/// </summary>
|
||||
LessThan,
|
||||
LessThan = 4,
|
||||
|
||||
/// <summary>
|
||||
/// 小于或等于
|
||||
/// </summary>
|
||||
LessThanOrEqual,
|
||||
LessThanOrEqual = 5,
|
||||
|
||||
/// <summary>
|
||||
/// 等于集合
|
||||
/// 在指定集合中
|
||||
/// </summary>
|
||||
In,
|
||||
In = 6,
|
||||
|
||||
/// <summary>
|
||||
/// 不等于集合
|
||||
/// 不在指定集合中
|
||||
/// </summary>
|
||||
NotIn,
|
||||
NotIn = 7,
|
||||
|
||||
/// <summary>
|
||||
/// 左边匹配
|
||||
/// 左侧模糊匹配
|
||||
/// </summary>
|
||||
LikeLeft,
|
||||
LikeLeft = 8,
|
||||
|
||||
/// <summary>
|
||||
/// 右边匹配
|
||||
/// 右侧模糊匹配
|
||||
/// </summary>
|
||||
LikeRight,
|
||||
LikeRight = 9,
|
||||
|
||||
/// <summary>
|
||||
/// 不相等
|
||||
/// 不等于
|
||||
/// </summary>
|
||||
NoEqual,
|
||||
NoEqual = 10,
|
||||
|
||||
/// <summary>
|
||||
/// 为空或空
|
||||
/// 为null或空
|
||||
/// </summary>
|
||||
IsNullOrEmpty,
|
||||
IsNullOrEmpty = 11,
|
||||
|
||||
/// <summary>
|
||||
/// 不为空
|
||||
/// 不为null
|
||||
/// </summary>
|
||||
IsNot,
|
||||
IsNot = 12,
|
||||
|
||||
/// <summary>
|
||||
/// 不匹配
|
||||
/// </summary>
|
||||
NoLike,
|
||||
NoLike = 13,
|
||||
|
||||
/// <summary>
|
||||
/// 时间段 值用 "|" 隔开
|
||||
/// 日期范围
|
||||
/// </summary>
|
||||
DateRange
|
||||
/// <remarks>
|
||||
/// 使用"|"分隔起始和结束日期
|
||||
/// </remarks>
|
||||
DateRange = 14
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,26 +6,33 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace Yi.Framework.Core.Enums
|
||||
{
|
||||
/// <summary>
|
||||
/// API返回状态码枚举
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 定义API接口统一的返回状态码
|
||||
/// 遵循HTTP状态码规范
|
||||
/// </remarks>
|
||||
public enum ResultCodeEnum
|
||||
{
|
||||
/// <summary>
|
||||
/// 操作成功。
|
||||
/// 操作成功
|
||||
/// </summary>
|
||||
Success = 200,
|
||||
|
||||
/// <summary>
|
||||
/// 操作不成功
|
||||
/// </summary>
|
||||
NotSuccess = 500,
|
||||
|
||||
/// <summary>
|
||||
/// 无权限
|
||||
/// 未授权访问
|
||||
/// </summary>
|
||||
NoPermission = 401,
|
||||
|
||||
/// <summary>
|
||||
/// 被拒绝
|
||||
/// 访问被拒绝
|
||||
/// </summary>
|
||||
Denied = 403
|
||||
Denied = 403,
|
||||
|
||||
/// <summary>
|
||||
/// 操作失败
|
||||
/// </summary>
|
||||
NotSuccess = 500
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,110 +4,131 @@ using Microsoft.AspNetCore.Http;
|
||||
|
||||
namespace Yi.Framework.Core.Extensions
|
||||
{
|
||||
/// <summary>
|
||||
/// HttpContext扩展方法类
|
||||
/// </summary>
|
||||
public static class HttpContextExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// 设置文件下载名称
|
||||
/// 设置内联文件下载响应头
|
||||
/// </summary>
|
||||
/// <param name="httpContext"></param>
|
||||
/// <param name="fileName"></param>
|
||||
/// <param name="httpContext">HTTP上下文</param>
|
||||
/// <param name="fileName">文件名</param>
|
||||
public static void FileInlineHandle(this HttpContext httpContext, string fileName)
|
||||
{
|
||||
string encodeFilename = System.Web.HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8"));
|
||||
httpContext.Response.Headers.Add("Content-Disposition", "inline;filename=" + encodeFilename);
|
||||
|
||||
var encodeFilename = System.Web.HttpUtility.UrlEncode(fileName, Encoding.UTF8);
|
||||
httpContext.Response.Headers.Add("Content-Disposition", $"inline;filename={encodeFilename}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置文件附件名称
|
||||
/// 设置附件下载响应头
|
||||
/// </summary>
|
||||
/// <param name="httpContext"></param>
|
||||
/// <param name="fileName"></param>
|
||||
/// <param name="httpContext">HTTP上下文</param>
|
||||
/// <param name="fileName">文件名</param>
|
||||
public static void FileAttachmentHandle(this HttpContext httpContext, string fileName)
|
||||
{
|
||||
string encodeFilename = System.Web.HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8"));
|
||||
httpContext.Response.Headers.Add("Content-Disposition", "attachment;filename=" + encodeFilename);
|
||||
|
||||
var encodeFilename = System.Web.HttpUtility.UrlEncode(fileName, Encoding.UTF8);
|
||||
httpContext.Response.Headers.Add("Content-Disposition", $"attachment;filename={encodeFilename}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取语言种类
|
||||
/// 获取客户端首选语言
|
||||
/// </summary>
|
||||
/// <param name="httpContext"></param>
|
||||
/// <returns></returns>
|
||||
/// <param name="httpContext">HTTP上下文</param>
|
||||
/// <returns>语言代码,默认返回zh-CN</returns>
|
||||
public static string GetLanguage(this HttpContext httpContext)
|
||||
{
|
||||
string res = "zh-CN";
|
||||
var str = httpContext.Request.Headers["Accept-Language"].FirstOrDefault();
|
||||
if (str is not null)
|
||||
{
|
||||
res = str.Split(",")[0];
|
||||
}
|
||||
return res;
|
||||
|
||||
const string defaultLanguage = "zh-CN";
|
||||
var acceptLanguage = httpContext.Request.Headers["Accept-Language"].FirstOrDefault();
|
||||
|
||||
return string.IsNullOrEmpty(acceptLanguage)
|
||||
? defaultLanguage
|
||||
: acceptLanguage.Split(',')[0];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判断是否为异步请求
|
||||
/// 判断是否为Ajax请求
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
/// <param name="request">HTTP请求</param>
|
||||
/// <returns>是否为Ajax请求</returns>
|
||||
public static bool IsAjaxRequest(this HttpRequest request)
|
||||
{
|
||||
string header = request.Headers["X-Requested-With"];
|
||||
return "XMLHttpRequest".Equals(header);
|
||||
const string ajaxHeader = "XMLHttpRequest";
|
||||
return ajaxHeader.Equals(request.Headers["X-Requested-With"],
|
||||
StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取客户端IP
|
||||
/// 获取客户端IP地址
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
/// <returns></returns>
|
||||
/// <param name="context">HTTP上下文</param>
|
||||
/// <returns>客户端IP地址</returns>
|
||||
public static string GetClientIp(this HttpContext context)
|
||||
{
|
||||
if (context == null) return "";
|
||||
var result = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
|
||||
if (string.IsNullOrEmpty(result))
|
||||
const string localhost = "127.0.0.1";
|
||||
if (context == null) return string.Empty;
|
||||
|
||||
// 尝试获取X-Forwarded-For头
|
||||
var ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
|
||||
|
||||
// 如果没有代理头,则获取远程IP
|
||||
if (string.IsNullOrEmpty(ip))
|
||||
{
|
||||
result = context.Connection.RemoteIpAddress?.ToString();
|
||||
ip = context.Connection.RemoteIpAddress?.ToString();
|
||||
}
|
||||
if (string.IsNullOrEmpty(result) || result.Contains("::1"))
|
||||
result = "127.0.0.1";
|
||||
|
||||
result = result.Replace("::ffff:", "127.0.0.1");
|
||||
//如果有端口号,删除端口号
|
||||
result = Regex.Replace(result, @":\d{1,5}$", "");
|
||||
//Ip规则校验
|
||||
var regResult =
|
||||
Regex.IsMatch(result, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$")
|
||||
|| Regex.IsMatch(result, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?):\d{1,5}$");
|
||||
// 处理特殊IP
|
||||
if (string.IsNullOrEmpty(ip) || ip.Contains("::1"))
|
||||
{
|
||||
return localhost;
|
||||
}
|
||||
|
||||
result = regResult ? result : "127.0.0.1";
|
||||
return result;
|
||||
// 清理IPv6格式
|
||||
ip = ip.Replace("::ffff:", localhost);
|
||||
|
||||
// 移除端口号
|
||||
ip = Regex.Replace(ip, @":\d{1,5}$", "");
|
||||
|
||||
// 验证IP格式
|
||||
var isValidIp = Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$") ||
|
||||
Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?):\d{1,5}$");
|
||||
|
||||
return isValidIp ? ip : localhost;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取浏览器标识
|
||||
/// 获取User-Agent信息
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
/// <returns></returns>
|
||||
/// <param name="context">HTTP上下文</param>
|
||||
/// <returns>User-Agent字符串</returns>
|
||||
public static string GetUserAgent(this HttpContext context)
|
||||
{
|
||||
return context.Request.Headers["User-Agent"];
|
||||
return context.Request.Headers["User-Agent"].ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取用户权限声明值
|
||||
/// </summary>
|
||||
/// <param name="context">HTTP上下文</param>
|
||||
/// <param name="permissionsName">权限声明名称</param>
|
||||
/// <returns>权限值数组</returns>
|
||||
public static string[]? GetUserPermissions(this HttpContext context, string permissionsName)
|
||||
{
|
||||
return context.User.Claims.Where(x => x.Type == permissionsName).Select(x => x.Value).ToArray();
|
||||
return context.User.Claims
|
||||
.Where(x => x.Type == permissionsName)
|
||||
.Select(x => x.Value)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判断是否是 WebSocket 请求
|
||||
/// 判断是否为WebSocket请求
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
/// <returns></returns>
|
||||
/// <param name="context">HTTP上下文</param>
|
||||
/// <returns>是否为WebSocket请求</returns>
|
||||
public static bool IsWebSocketRequest(this HttpContext context)
|
||||
{
|
||||
return context.WebSockets.IsWebSocketRequest || context.Request.Path == "/ws";
|
||||
return context.WebSockets.IsWebSocketRequest ||
|
||||
context.Request.Path == "/ws";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,25 +3,48 @@ using System.Text.Json.Serialization;
|
||||
|
||||
namespace Yi.Framework.Core.Json;
|
||||
|
||||
/// <summary>
|
||||
/// DateTime JSON序列化转换器
|
||||
/// </summary>
|
||||
public class DatetimeJsonConverter : JsonConverter<DateTime>
|
||||
{
|
||||
private string _format;
|
||||
public DatetimeJsonConverter(string format="yyyy-MM-dd HH:mm:ss")
|
||||
private readonly string _dateFormat;
|
||||
|
||||
/// <summary>
|
||||
/// 初始化DateTime转换器
|
||||
/// </summary>
|
||||
/// <param name="format">日期格式化字符串,默认为yyyy-MM-dd HH:mm:ss</param>
|
||||
public DatetimeJsonConverter(string format = "yyyy-MM-dd HH:mm:ss")
|
||||
{
|
||||
_format = format;
|
||||
_dateFormat = format;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 从JSON读取DateTime值
|
||||
/// </summary>
|
||||
/// <param name="reader">JSON读取器</param>
|
||||
/// <param name="typeToConvert">目标类型</param>
|
||||
/// <param name="options">JSON序列化选项</param>
|
||||
/// <returns>DateTime值</returns>
|
||||
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||||
{
|
||||
if(reader.TokenType==JsonTokenType.String)
|
||||
if (reader.TokenType == JsonTokenType.String)
|
||||
{
|
||||
if (DateTime.TryParse(reader.GetString(), out DateTime dateTime)) return dateTime;
|
||||
return DateTime.TryParse(reader.GetString(), out DateTime dateTime)
|
||||
? dateTime
|
||||
: reader.GetDateTime();
|
||||
}
|
||||
return reader.GetDateTime();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将DateTime写入JSON
|
||||
/// </summary>
|
||||
/// <param name="writer">JSON写入器</param>
|
||||
/// <param name="value">DateTime值</param>
|
||||
/// <param name="options">JSON序列化选项</param>
|
||||
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
|
||||
{
|
||||
writer.WriteStringValue(value.ToString(_format));
|
||||
writer.WriteStringValue(value.ToString(_dateFormat));
|
||||
}
|
||||
}
|
||||
@@ -8,52 +8,81 @@ using Volo.Abp.Modularity;
|
||||
|
||||
namespace Yi.Framework.Core.Modularity;
|
||||
|
||||
[Dependency(ReplaceServices =true)]
|
||||
/// <summary>
|
||||
/// Yi框架模块管理器
|
||||
/// </summary>
|
||||
[Dependency(ReplaceServices = true)]
|
||||
public class YiModuleManager : ModuleManager, IModuleManager, ISingletonDependency
|
||||
{
|
||||
private readonly IModuleContainer _moduleContainer;
|
||||
private readonly IEnumerable<IModuleLifecycleContributor> _lifecycleContributors;
|
||||
private readonly ILogger<YiModuleManager> _logger;
|
||||
|
||||
public YiModuleManager(IModuleContainer moduleContainer, ILogger<YiModuleManager> logger, IOptions<AbpModuleLifecycleOptions> options, IServiceProvider serviceProvider) : base(moduleContainer, logger, options, serviceProvider)
|
||||
/// <summary>
|
||||
/// 初始化模块管理器
|
||||
/// </summary>
|
||||
public YiModuleManager(
|
||||
IModuleContainer moduleContainer,
|
||||
ILogger<YiModuleManager> logger,
|
||||
IOptions<AbpModuleLifecycleOptions> options,
|
||||
IServiceProvider serviceProvider)
|
||||
: base(moduleContainer, logger, options, serviceProvider)
|
||||
{
|
||||
_moduleContainer = moduleContainer;
|
||||
_logger = logger;
|
||||
_lifecycleContributors = options.Value.Contributors.Select(serviceProvider.GetRequiredService).Cast<IModuleLifecycleContributor>().ToArray();
|
||||
_lifecycleContributors = options.Value.Contributors
|
||||
.Select(serviceProvider.GetRequiredService)
|
||||
.Cast<IModuleLifecycleContributor>()
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化所有模块
|
||||
/// </summary>
|
||||
/// <param name="context">应用程序初始化上下文</param>
|
||||
public override async Task InitializeModulesAsync(ApplicationInitializationContext context)
|
||||
{
|
||||
|
||||
_logger.LogDebug("==========模块Initialize初始化统计-跳过0ms模块==========");
|
||||
var total = 0;
|
||||
var watch =new Stopwatch();
|
||||
long totalTime = 0;
|
||||
|
||||
var moduleCount = 0;
|
||||
var stopwatch = new Stopwatch();
|
||||
var totalTime = 0L;
|
||||
|
||||
foreach (var contributor in _lifecycleContributors)
|
||||
{
|
||||
foreach (var module in _moduleContainer.Modules)
|
||||
{
|
||||
try
|
||||
{
|
||||
watch.Restart();
|
||||
stopwatch.Restart();
|
||||
await contributor.InitializeAsync(context, module.Instance);
|
||||
watch.Stop();
|
||||
totalTime += watch.ElapsedMilliseconds;
|
||||
total++;
|
||||
if (watch.ElapsedMilliseconds > 1)
|
||||
stopwatch.Stop();
|
||||
|
||||
totalTime += stopwatch.ElapsedMilliseconds;
|
||||
moduleCount++;
|
||||
|
||||
// 仅记录耗时超过1ms的模块
|
||||
if (stopwatch.ElapsedMilliseconds > 1)
|
||||
{
|
||||
_logger.LogDebug($"耗时-{watch.ElapsedMilliseconds}ms,已加载模块-{module.Assembly.GetName().Name}");
|
||||
_logger.LogDebug(
|
||||
"耗时-{Time}ms,已加载模块-{ModuleName}",
|
||||
stopwatch.ElapsedMilliseconds,
|
||||
module.Assembly.GetName().Name);
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new AbpInitializationException($"An error occurred during the initialize {contributor.GetType().FullName} phase of the module {module.Type.AssemblyQualifiedName}: {ex.Message}. See the inner exception for details.", ex);
|
||||
throw new AbpInitializationException(
|
||||
$"模块 {module.Type.AssemblyQualifiedName} 在 {contributor.GetType().FullName} 阶段初始化失败: {ex.Message}",
|
||||
ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_logger.LogInformation($"==========【{total}】个模块初始化执行完毕,总耗时【{totalTime}ms】==========");
|
||||
|
||||
_logger.LogInformation(
|
||||
"==========【{Count}】个模块初始化执行完毕,总耗时【{Time}ms】==========",
|
||||
moduleCount,
|
||||
totalTime);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,8 +2,28 @@
|
||||
|
||||
namespace Yi.Framework.Core
|
||||
{
|
||||
public class YiFrameworkCoreModule:AbpModule
|
||||
/// <summary>
|
||||
/// Yi框架核心模块
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 提供框架的基础功能和核心服务
|
||||
/// </remarks>
|
||||
public class YiFrameworkCoreModule : AbpModule
|
||||
{
|
||||
/// <summary>
|
||||
/// 配置服务
|
||||
/// </summary>
|
||||
public override void ConfigureServices(ServiceConfigurationContext context)
|
||||
{
|
||||
base.ConfigureServices(context);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 应用程序初始化
|
||||
/// </summary>
|
||||
public override void OnApplicationInitialization(ApplicationInitializationContext context)
|
||||
{
|
||||
base.OnApplicationInitialization(context);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user