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:错误消息
  • 提供静态方法 SuccessFail(message) 便于创建结果

应用场景

这套代码通常用于:

  1. 动态路由管理系统 - 扫描和管理应用中的所有 MVC 路由
  2. SEO 优化 - 命名空间中包含 Seo,可能用于 SEO 友好的 URL 管理
  3. API 文档生成 - 自动发现和记录所有控制器动作
  4. 权限管理 - 基于路由定义进行访问控制

技术亮点

  • 使用 required 关键字(C# 11+)强制初始化必需属性
  • 使用 record 类型定义不可变的验证结果
  • 使用 Mapster 进行高性能对象映射
  • 集合初始化使用 = [] 语法(C# 12+)
评论加载中...