网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using System.Text.RegularExpressions;
using System.Threading;
using Dpz.Core.Public.ViewModel.Request.HandlerRequest;
using Dpz.Core.Public.ViewModel.RequestEvent;
using Dpz.Core.Public.ViewModel.Response;

namespace Dpz.Core.Service.Event;

public class ArticleReadHandler(IArticleService articleService, IMediator mediator, IMapper mapper)
    : IRequestHandler<ArticleReadRequest, VmArticle?>
{
    public async Task<VmArticle?> Handle(
        ArticleReadRequest request,
        CancellationToken cancellationToken
    )
    {
        var article = await articleService.GetArticleAsync(request.Id);
        if (article == null)
        {
            return null;
        }

        var pattern = string.Empty;
        if (!string.IsNullOrWhiteSpace(request.Text))
        {
            var keywords = request
                .Text.Split(' ')
                .Where(x => !string.IsNullOrEmpty(x) && x.Length > 1)
                .Distinct()
                .Select(Regex.Escape)
                .ToList();
            pattern = string.Join('|', keywords);
        }

        if (string.IsNullOrWhiteSpace(pattern))
        {
            return article;
        }

        var response = mapper.Map<ArticleSearchResultResponse>(article);

        var titleSearchRequest = new ContentSearchRequest
        {
            Text = article.Title,
            Pattern = pattern,
        };
        response.TitleSearchResult = await mediator.Send(titleSearchRequest, cancellationToken);

        var contentSearchRequest = new ContentSearchRequest
        {
            Text = article.Markdown,
            Pattern = pattern,
        };
        response.ContentSearchResult = await mediator.Send(contentSearchRequest, cancellationToken);

        return response;
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这段代码是一个 C# 类 ArticleReadHandler 的实现,它实现了 IRequestHandler<ArticleReadRequest, VmArticle?> 接口。这个类的主要功能是处理读取文章的请求,并根据请求中的文本内容进行关键词搜索。以下是代码的详细解释:

1. 类的构造函数

public ArticleReadHandler(IArticleService articleService, IMediator mediator, IMapper mapper)
  • 这个构造函数接受三个参数:
    • IArticleService articleService:用于获取文章的服务。
    • IMediator mediator:用于发送请求和接收响应的中介者。
    • IMapper mapper:用于对象映射的工具。

2. 处理请求的方法

public async Task<VmArticle?> Handle(ArticleReadRequest request, CancellationToken cancellationToken)
  • Handle 方法是处理 ArticleReadRequest 请求的核心逻辑。
  • 它返回一个 VmArticle? 类型的结果,表示可能返回一个文章视图模型或 null

3. 获取文章

var article = await articleService.GetArticleAsync(request.Id);
if (article == null)
{
    return null;
}
  • 使用 articleService 根据请求中的 Id 获取文章。如果找不到文章,则返回 null

4. 处理关键词搜索

var pattern = string.Empty;
if (!string.IsNullOrWhiteSpace(request.Text))
{
    var keywords = request
        .Text.Split(' ')
        .Where(x => !string.IsNullOrEmpty(x) && x.Length > 1)
        .Distinct()
        .Select(Regex.Escape)
        .ToList();
    pattern = string.Join('|', keywords);
}
  • 如果请求中包含文本 (request.Text),则将其分割成关键词。
  • 过滤掉空字符串和长度小于等于1的词,去重,并使用 Regex.Escape 转义关键词,以便在正则表达式中安全使用。
  • 最后,将关键词用 | 连接成一个正则表达式模式。

5. 如果没有关键词,直接返回文章

if (string.IsNullOrWhiteSpace(pattern))
{
    return article;
}
  • 如果没有生成有效的正则表达式模式,则直接返回文章。

6. 创建响应对象

var response = mapper.Map<ArticleSearchResultResponse>(article);
  • 使用 mapper 将文章映射到 ArticleSearchResultResponse 类型的响应对象。

7. 进行标题和内容的搜索

var titleSearchRequest = new ContentSearchRequest
{
    Text = article.Title,
    Pattern = pattern,
};
response.TitleSearchResult = await mediator.Send(titleSearchRequest, cancellationToken);

var contentSearchRequest = new ContentSearchRequest
{
    Text = article.Markdown,
    Pattern = pattern,
};
response.ContentSearchResult = await mediator.Send(contentSearchRequest, cancellationToken);
  • 创建 ContentSearchRequest 对象,分别用于搜索文章标题和内容。
  • 使用 mediator.Send 方法发送搜索请求,并将结果存储在响应对象的 TitleSearchResultContentSearchResult 属性中。

8. 返回响应

return response;
  • 最后,返回包含文章和搜索结果的响应对象。

总结

整体来看,这段代码的功能是处理读取文章的请求,获取文章内容,并根据请求中的文本进行关键词搜索,返回包含文章信息和搜索结果的响应。

loading