网站首页 网站源码
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;
}
}
这段代码是一个 C# 类 ArticleReadHandler
的实现,它实现了 IRequestHandler<ArticleReadRequest, VmArticle?>
接口。这个类的主要功能是处理读取文章的请求,并根据请求中的文本内容进行关键词搜索。以下是代码的详细解释:
public ArticleReadHandler(IArticleService articleService, IMediator mediator, IMapper mapper)
IArticleService articleService
:用于获取文章的服务。IMediator mediator
:用于发送请求和接收响应的中介者。IMapper mapper
:用于对象映射的工具。public async Task<VmArticle?> Handle(ArticleReadRequest request, CancellationToken cancellationToken)
Handle
方法是处理 ArticleReadRequest
请求的核心逻辑。VmArticle?
类型的结果,表示可能返回一个文章视图模型或 null
。var article = await articleService.GetArticleAsync(request.Id);
if (article == null)
{
return null;
}
articleService
根据请求中的 Id
获取文章。如果找不到文章,则返回 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);
}
request.Text
),则将其分割成关键词。Regex.Escape
转义关键词,以便在正则表达式中安全使用。|
连接成一个正则表达式模式。if (string.IsNullOrWhiteSpace(pattern))
{
return article;
}
var response = mapper.Map<ArticleSearchResultResponse>(article);
mapper
将文章映射到 ArticleSearchResultResponse
类型的响应对象。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
方法发送搜索请求,并将结果存储在响应对象的 TitleSearchResult
和 ContentSearchResult
属性中。return response;
整体来看,这段代码的功能是处理读取文章的请求,获取文章内容,并根据请求中的文本进行关键词搜索,返回包含文章信息和搜索结果的响应。