网站首页 网站源码
namespace Dpz.Core.Service.RepositoryServiceImpl;
public class CodeNoteService(
IRepository<CodeNote> repository,
IMapper mapper,
ILogger<CodeNoteService> logger,
IConfiguration configuration,
IFusionCache fusionCache
) : ICodeNoteService
{
public async Task<string> SaveNoteAsync(string[]? path, string name, string note)
{
var pathStr = GetPathStr(path);
var codeNote = await repository
.SearchFor(x => x.Name == name && x.Path == pathStr)
.FirstOrDefaultAsync();
if (codeNote == null)
{
var entity = new CodeNote
{
CreateTime = DateTime.Now,
LastUpdateTime = DateTime.Now,
Name = name,
Note = note,
Path = pathStr,
};
await repository.InsertAsync(entity);
return entity.Id.ToString();
}
codeNote.Note = note;
codeNote.LastUpdateTime = DateTime.Now;
await repository.UpdateAsync(codeNote);
return codeNote.Id.ToString();
}
public async Task<VmCodeNote?> FindAsync(string[]? path, string name)
{
var pathStr = GetPathStr(path);
var codeNote = await repository
.SearchFor(x => x.Name == name && x.Path == pathStr)
.FirstOrDefaultAsync();
if (codeNote == null)
{
return null;
}
return mapper.Map<VmCodeNote>(codeNote);
}
private static string GetPathStr(string[]? path)
{
return path is not null && path.Length > 0 ? string.Join("/", path) : "";
}
public async Task SaveAiAnalyzeResultAsync(string[]? path, string name, string analyzeResult)
{
var pathStr = GetPathStr(path);
var codeNote = await repository
.SearchFor(x => x.Name == name && x.Path == pathStr)
.FirstOrDefaultAsync();
if (codeNote == null)
{
var entity = new CodeNote
{
CreateTime = DateTime.Now,
LastUpdateTime = DateTime.Now,
Name = name,
AiAnalyzeResult = analyzeResult,
Path = pathStr,
};
await repository.InsertAsync(entity);
await ClearCacheAsync();
return;
}
codeNote.AiAnalyzeResult = analyzeResult;
codeNote.LastUpdateTime = DateTime.Now;
await repository.UpdateAsync(codeNote);
await ClearCacheAsync();
return;
async Task ClearCacheAsync()
{
var codeView =
configuration.GetSection("CodeView").Get<CodeViewOption>()
?? throw new InvalidConfigurationException("CodeView");
var cachePath = new List<string>();
cachePath.AddRange(path ?? []);
cachePath.Add(name);
var removeCacheKey = CacheKey.CodeViewKey(cachePath.ToArray(), codeView.ToString());
await fusionCache.RemoveAsync(removeCacheKey);
}
}
public async Task<List<VmCodeNote>> GetNoteAsync(string[]? path)
{
#if DEBUG
var stopwatch = new Stopwatch();
stopwatch.Start();
#endif
var pathStr = GetPathStr(path);
var list = await repository.SearchFor(x => x.Path == pathStr).ToListAsync();
#if DEBUG
stopwatch.Stop();
var queryTime = stopwatch.Elapsed;
logger.LogInformation("查询耗时:{QueryTime} ms", queryTime.TotalMilliseconds);
#endif
return mapper.Map<List<VmCodeNote>>(list);
}
public async Task<List<VmCodeNote>> GetAllNoteAsync()
{
var list = await repository.SearchFor(x => true).ToListAsync();
return mapper.Map<List<VmCodeNote>>(list);
}
public async Task DeleteAsync(string[]? path, string name)
{
var pathStr = GetPathStr(path);
await repository.DeleteAsync(x => x.Name == name && x.Path == pathStr);
}
}
上述代码定义了一个名为 CodeNoteService
的服务类,主要用于管理代码笔记(CodeNote
)的 CRUD(创建、读取、更新、删除)操作。这个服务类实现了 ICodeNoteService
接口,并依赖于多个组件,如 IRepository<CodeNote>
、IMapper
、ILogger<CodeNoteService>
、IConfiguration
和 IHybridCachingProvider
。以下是该类的主要功能和方法的详细解释:
保存笔记 (SaveNoteAsync
):
CodeNote
实体并插入到数据库中。查找笔记 (FindAsync
):
IMapper
将 CodeNote
实体映射到视图模型 VmCodeNote
并返回;如果未找到,则返回 null
。保存 AI 分析结果 (SaveAiAnalyzeResultAsync
):
CodeNote
实体并插入到数据库中。ClearCacheAsync
方法清除相关缓存。获取笔记 (GetNoteAsync
):
IMapper
将 CodeNote
实体列表映射到 VmCodeNote
列表并返回。获取所有笔记 (GetAllNoteAsync
):
VmCodeNote
列表返回。删除笔记 (DeleteAsync
):
GetPathStr:
/
)连接各个部分。如果路径为空或为 null
,则返回空字符串。ClearCacheAsync:
CodeView
的设置,并生成缓存键以便于删除。在 GetNoteAsync
方法中,使用 ILogger
记录查询耗时,便于调试和性能监控。
CodeNoteService
类提供了一系列方法来管理代码笔记的生命周期,包括创建、更新、查找、删除和缓存管理。它通过依赖注入的方式使用了多个服务,确保了代码的模块化和可测试性。