网站首页 网站源码
using System.Text;
using Dpz.Core.Service.Network;
using Dpz.Core.Service.Network.Models;
using Dpz.Core.Service.RepositoryService;
using Hangfire;
using JetBrains.Annotations;
using Medallion.Threading;
using Microsoft.Extensions.Logging;
namespace Dpz.Core.Hangfire;
[UsedImplicitly]
public class AnalyzeCodeActivator(
AnalyzeService analyzeService,
ICodeNoteService codeNoteService,
IDistributedLockProvider distributedLockProvider,
ILogger<AnalyzeCodeActivator> logger
) : JobActivator
{
/// <summary>
/// analyze code
/// </summary>
/// <param name="codeContent"></param>
/// <param name="path"></param>
/// <param name="fileName"></param>
[ProlongExpirationTime]
public async Task AnalyzeAsync(string codeContent, string[] path, string fileName)
{
var key = new List<string>(path) { fileName };
if (GetContentLineCount(codeContent) < 50)
{
return;
}
var keyParts = new List<string>(path) { fileName };
var subKey = Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Join("\0", keyParts)));
var lockKey = $"AI_Analyze.Code.Lock:{subKey}";
await using (await distributedLockProvider.AcquireLockAsync(lockKey))
{
var codeNote = await codeNoteService.FindAsync(path, fileName);
if (!string.IsNullOrWhiteSpace(codeNote?.AiAnalyzeResult))
{
return;
}
var prompt = new StringBuilder(codeContent)
.AppendLine()
.AppendLine()
.Append("请解释一下上述代码的功能")
.ToString();
var result = await analyzeService.ChatAsync(
[
new ChatMessage
{
Role = "system",
Message = "你是一个经验丰富且专业的开发人员",
},
new ChatMessage { Role = "user", Message = prompt },
]
);
if (result is { Success: true, Data: not null })
{
logger.LogInformation(
"AI分析成功 | Path:{@Path} File:{FileName},Data:{@Data}",
path,
fileName,
result.Data
);
await codeNoteService.SaveAiAnalyzeResultAsync(path, fileName, result.Data);
return;
}
logger.LogWarning(
"AI分析失败 | 错误信息:{Message} | Path:{@Path} File:{FileName}",
result.Message,
path,
fileName
);
}
}
private static int GetContentLineCount(string codeContent)
{
return codeContent.Split(["\r\n", "\r", "\n"], StringSplitOptions.None).Length;
}
}
这段代码定义了一个名为 AnalyzeCodeActivator
的类,它是一个 Hangfire 任务激活器,主要用于分析代码并生成相应的注释或解释。以下是代码的主要功能和结构的详细解释:
AnalyzeCodeActivator
继承自 JobActivator
,用于在 Hangfire 中激活任务。AnalyzeService analyzeService
: 用于与 AI 分析服务交互。ICodeNoteService codeNoteService
: 用于处理代码注释的服务。IDistributedLockProvider distributedLockProvider
: 用于提供分布式锁的服务,确保在并发情况下的安全性。ILogger<AnalyzeCodeActivator> logger
: 用于记录日志的服务。AnalyzeAsync
参数:
string codeContent
: 要分析的代码内容。string[] path
: 代码文件的路径。string fileName
: 代码文件的名称。功能:
distributedLockProvider
获取锁,确保在并发环境下的安全性。codeNoteService
,检查该文件是否已经有 AI 分析结果。如果有,则返回。analyzeService.ChatAsync
方法与 AI 进行交互,发送构建的提示信息。codeNoteService
。GetContentLineCount
Split
方法根据不同的换行符(\r\n
, \r
, \n
)将内容分割成行,并返回行数。整体来看,这段代码的目的是在 Hangfire 任务中分析代码文件的内容,并通过 AI 生成相应的解释或注释。它确保了在并发环境下的安全性,并记录了分析的结果和可能的错误信息。