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)
这个方法的执行流程:
- 收集图片:遍历请求中的所有 Markdown 内容
- 解析图片:从每个 Markdown 文档中提取图片 URL
- 触发删除:通过 Mediator 发送图片删除请求
- 返回结果:返回
Unit.Value(表示无返回值的异步操作完成)
图片提取逻辑
private async Task<List<string>> GetImagesByMarkdownAsync(string markdown)
该方法的处理步骤:
- Markdown 转 HTML:
markdown.MarkdownToHtml()将 Markdown 转换为 HTML - 解析 HTML:使用
HtmlParser解析 HTML 文档 - 查找图片元素:获取所有
<img>标签 - 提取 URL:调用
GetElementImageUrls提取图片地址
URL 提取工具方法
private static List<string> GetElementImageUrls(IHtmlCollection<IElement> elements)
使用 LINQ 链式操作:
- 提取每个 img 元素的
src属性 - 过滤掉空值和 null 值
- 返回有效的图片 URL 列表
设计模式
- 中介者模式:通过
IMediator解耦不同功能模块 - 命令模式:使用
RemoveImagesRequest封装图片删除操作 - 责任链模式:通过 MediatR 框架实现请求处理链
技术特点
- 异步处理:所有 I/O 操作都使用异步方法
- HTML 解析:使用专业的 HTML 解析器而不是正则表达式
- 空值安全:多重空值检查确保程序健壮性
- 资源清理:在删除 Markdown 时自动清理关联的图片资源
这个类的主要作用是确保在删除 Markdown 文档时,文档中引用的图片也能被正确清理,避免产生孤立的图片文件。
评论加载中...