using Dpz.Core.Entity.Base.MapperConfig;
using Dpz.Core.Public.Entity;
using Dpz.Core.Public.Entity.Seo;
using Mapster;
namespace Dpz.Core.Public.ViewModel;
/// <summary>
/// MVC 页面路由目录项
/// </summary>
public class VmPageRouteDefinition : IHaveCustomMapping
{
/// <summary>
/// Id
/// </summary>
public string? Id { get; set; }
/// <summary>
/// 标准化 Action 路由键
/// </summary>
public required string RouteKey { get; set; }
/// <summary>
/// Area 名称
/// </summary>
public string? Area { get; set; }
/// <summary>
/// Controller 名称
/// </summary>
public required string Controller { get; set; }
/// <summary>
/// Action 名称
/// </summary>
public required string Action { get; set; }
/// <summary>
/// HTTP 方法汇总
/// </summary>
public List<string> HttpMethods { get; set; } = [];
/// <summary>
/// 实际注册的 Endpoint 变体
/// </summary>
public List<VmPageRouteEndpointDefinition> Endpoints { get; set; } = [];
/// <summary>
/// 可配置参数
/// </summary>
public List<VmPageRouteParameterDefinition> Parameters { get; set; } = [];
/// <summary>
/// 是否仍然存在于最新扫描结果
/// </summary>
public bool IsActive { get; set; }
/// <summary>
/// 最后扫描时间
/// </summary>
public DateTime LastScannedAt { get; set; }
/// <summary>
/// Executes CreateMappings.
/// </summary>
public static void CreateMappings(TypeAdapterConfig cfg)
{
cfg.NewConfig<PageRouteDefinition, VmPageRouteDefinition>()
.MapWith(source => new VmPageRouteDefinition
{
Id = source.Id.ToString(),
RouteKey = source.RouteKey,
Area = source.Area,
Controller = source.Controller,
Action = source.Action,
HttpMethods = source.HttpMethods,
Endpoints = source
.Endpoints.Select(x => new VmPageRouteEndpointDefinition
{
RouteName = x.RouteName,
Template = x.Template,
HttpMethods = x.HttpMethods,
Defaults = x.Defaults,
RequiredValues = x.RequiredValues,
})
.ToList(),
Parameters = source
.Parameters.Select(x => new VmPageRouteParameterDefinition
{
Name = x.Name,
TypeName = x.TypeName,
Source = x.Source,
IsOptional = x.IsOptional,
})
.ToList(),
IsActive = source.IsActive,
LastScannedAt = source.LastScannedAt,
});
}
}
/// <summary>
/// MVC 页面路由参数目录项
/// </summary>
public class VmPageRouteParameterDefinition
{
/// <summary>
/// 参数名称
/// </summary>
public required string Name { get; set; }
/// <summary>
/// 参数类型
/// </summary>
public string? TypeName { get; set; }
/// <summary>
/// 参数来源
/// </summary>
public PageRouteParameterSource Source { get; set; }
/// <summary>
/// 是否可选
/// </summary>
public bool IsOptional { get; set; }
}
/// <summary>
/// 路由目录保存模型
/// </summary>
public class VmSavePageRouteDefinition
{
/// <summary>
/// Area 名称
/// </summary>
public string? Area { get; set; }
/// <summary>
/// Controller 名称
/// </summary>
public required string Controller { get; set; }
/// <summary>
/// Action 名称
/// </summary>
public required string Action { get; set; }
/// <summary>
/// HTTP 方法
/// </summary>
public List<string> HttpMethods { get; set; } = [];
/// <summary>
/// 实际注册的 Endpoint 变体
/// </summary>
public List<VmPageRouteEndpointDefinition> Endpoints { get; set; } = [];
/// <summary>
/// 可配置参数
/// </summary>
public List<VmPageRouteParameterDefinition> Parameters { get; set; } = [];
}
/// <summary>
/// MVC Action 对应的实际 Endpoint 定义
/// </summary>
public class VmPageRouteEndpointDefinition
{
/// <summary>
/// 路由名称
/// </summary>
public string? RouteName { get; set; }
/// <summary>
/// 路由模板
/// </summary>
public required string Template { get; set; }
/// <summary>
/// HTTP 方法
/// </summary>
public List<string> HttpMethods { get; set; } = [];
/// <summary>
/// 路由默认值
/// </summary>
public Dictionary<string, string> Defaults { get; set; } = [];
/// <summary>
/// 路由必需值
/// </summary>
public Dictionary<string, string> RequiredValues { get; set; } = [];
}
/// <summary>
/// 页面路由校验结果
/// </summary>
public sealed record PageRouteValidationResult(bool IsValid, string? ErrorMessage)
{
/// <summary>
/// 成功结果
/// </summary>
public static PageRouteValidationResult Success { get; } = new(true, null);
/// <summary>
/// 失败结果
/// </summary>
public static PageRouteValidationResult Fail(string message)
{
return new PageRouteValidationResult(false, message);
}
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
代码解释
这是一个 ASP.NET Core MVC 应用中用于页面路由定义和管理的 ViewModel(视图模型)文件。代码使用了 Mapster 进行对象映射。
主要组成部分
1. VmPageRouteDefinition - 页面路由定义视图模型
这是核心的路由定义类,包含:
- 基本信息:Id、Area、Controller、Action
- RouteKey:标准化的路由键(如 "Admin/User/Index")
- HttpMethods:支持的 HTTP 方法列表(GET、POST 等)
- Endpoints:实际注册的端点变体集合
- Parameters:可配置的参数列表
- 状态信息:IsActive(是否活跃)、LastScannedAt(最后扫描时间)
关键方法 CreateMappings:
public static void CreateMappings(TypeAdapterConfig cfg)
使用 Mapster 配置从实体类 PageRouteDefinition 到视图模型 VmPageRouteDefinition 的映射规则,主要处理:
- Id 转换为字符串
- 嵌套集合的映射(Endpoints、Parameters)
2. VmPageRouteParameterDefinition - 路由参数定义
描述路由中的参数信息:
- Name:参数名称
- TypeName:参数类型(如 "int", "string")
- Source:参数来源(枚举类型,可能是 Query、Route、Body 等)
- IsOptional:是否可选参数
3. VmSavePageRouteDefinition - 路由保存模型
用于创建或更新路由定义的数据传输对象,包含与 VmPageRouteDefinition 相似的字段,但没有 Id 和状态信息。
4. VmPageRouteEndpointDefinition - 端点定义
描述一个具体的路由端点:
- RouteName:路由名称
- Template:路由模板(如 "api/{controller}/{action}")
- HttpMethods:支持的 HTTP 方法
- Defaults:默认值字典
- RequiredValues:必需值字典
5. PageRouteValidationResult - 校验结果记录
使用 C# 9.0+ 的 record 类型定义验证结果:
- IsValid:是否有效
- ErrorMessage:错误消息
- 提供静态方法
Success和Fail(message)便于创建结果
应用场景
这套代码通常用于:
- 动态路由管理系统 - 扫描和管理应用中的所有 MVC 路由
- SEO 优化 - 命名空间中包含
Seo,可能用于 SEO 友好的 URL 管理 - API 文档生成 - 自动发现和记录所有控制器动作
- 权限管理 - 基于路由定义进行访问控制
技术亮点
- 使用 required 关键字(C# 11+)强制初始化必需属性
- 使用 record 类型定义不可变的验证结果
- 使用 Mapster 进行高性能对象映射
- 集合初始化使用
= []语法(C# 12+)
AI 正在分析代码…
评论加载中...