using Dpz.Core.Service.Mediator.Features.Media.Commands;

namespace Dpz.Core.Service.Mediator.Features.Markdown.Commands;

/// <summary>
/// 处理 Markdown 删除时的图片清理(兼容旧链路,已过时)。
/// </summary>
[Obsolete("已过时,改用消息队列处理,后续版本将会删除 ")]
public class DeleteMarkdownEvent(IMediator mediator) : IRequestHandler<DeleteMarkdownRequest>
{
    private readonly HtmlParser _htmlParse = new();

    /// <summary>
    /// 解析 Markdown 中的图片并触发删除请求。
    /// </summary>
    public async ValueTask<Unit> Handle(
        DeleteMarkdownRequest request,
        CancellationToken cancellationToken
    )
    {
        var images = new List<string>();
        foreach (var markdown in request.Markdown)
        {
            images.AddRange(await GetImagesByMarkdownAsync(markdown));
        }

        await mediator.Send(new RemoveImagesRequest { Images = images }, cancellationToken);
        return Unit.Value;
    }

    private async Task<List<string>> GetImagesByMarkdownAsync(string markdown)
    {
        var htmlContent = markdown.MarkdownToHtml();

        var document = await _htmlParse.ParseDocumentAsync(htmlContent);
        var imageElements = document.GetElementsByTagName("img");
        return GetElementImageUrls(imageElements);
    }

    private static List<string> GetElementImageUrls(IHtmlCollection<IElement> elements)
    {
        return elements
            .Select(x => x.Attributes["src"])
            .Where(x => x != null)
            .Select(x => x!.Value)
            .Where(x => !string.IsNullOrEmpty(x))
            .ToList();
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这段代码定义了一个用于处理 Markdown 文档删除时的图片清理功能的事件处理器。让我详细解释一下:

类概述

[Obsolete("已过时,改用消息队列处理,后续版本将会删除 ")]
public class DeleteMarkdownEvent(IMediator mediator) : IRequestHandler<DeleteMarkdownRequest>
  • 这是一个已标记为过时的事件处理器类
  • 使用了 C# 12 的主构造函数语法,直接在类名后声明参数
  • 实现了 IRequestHandler<DeleteMarkdownRequest> 接口,用于处理删除 Markdown 的请求
  • 依赖注入了 IMediator 用于发送其他请求

核心功能

主处理方法

public async ValueTask<Unit> Handle(DeleteMarkdownRequest request, CancellationToken cancellationToken)

这个方法的执行流程:

  1. 收集图片:遍历请求中的所有 Markdown 内容
  2. 解析图片:从每个 Markdown 文档中提取图片 URL
  3. 触发删除:通过 Mediator 发送图片删除请求
  4. 返回结果:返回 Unit.Value(表示无返回值的异步操作完成)

图片提取逻辑

private async Task<List<string>> GetImagesByMarkdownAsync(string markdown)

该方法的处理步骤:

  1. Markdown 转 HTMLmarkdown.MarkdownToHtml() 将 Markdown 转换为 HTML
  2. 解析 HTML:使用 HtmlParser 解析 HTML 文档
  3. 查找图片元素:获取所有 <img> 标签
  4. 提取 URL:调用 GetElementImageUrls 提取图片地址

URL 提取工具方法

private static List<string> GetElementImageUrls(IHtmlCollection<IElement> elements)

使用 LINQ 链式操作:

  • 提取每个 img 元素的 src 属性
  • 过滤掉空值和 null 值
  • 返回有效的图片 URL 列表

设计模式

  1. 中介者模式:通过 IMediator 解耦不同功能模块
  2. 命令模式:使用 RemoveImagesRequest 封装图片删除操作
  3. 责任链模式:通过 MediatR 框架实现请求处理链

技术特点

  • 异步处理:所有 I/O 操作都使用异步方法
  • HTML 解析:使用专业的 HTML 解析器而不是正则表达式
  • 空值安全:多重空值检查确保程序健壮性
  • 资源清理:在删除 Markdown 时自动清理关联的图片资源

这个类的主要作用是确保在删除 Markdown 文档时,文档中引用的图片也能被正确清理,避免产生孤立的图片文件。

评论加载中...