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 codeNote = await BuildFluent(path, name, out var 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)
{
if (string.IsNullOrWhiteSpace(name))
{
return null;
}
var codeNote = await BuildFluent(path, name, out _).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) : "";
}
private static FilterDefinition<CodeNote> BuildFilter(
string[]? path,
string? name,
out string pathStr
)
{
pathStr = GetPathStr(path);
return Builders<CodeNote>.Filter.And(
Builders<CodeNote>.Filter.Eq(x => x.Path, pathStr),
Builders<CodeNote>.Filter.Eq(x => x.Name, name)
);
}
private IFindFluent<CodeNote, CodeNote> BuildFluent(
string[]? path,
string name,
out string pathStr
)
{
var filter = BuildFilter(path, name, out pathStr);
return repository.SearchFor(
filter,
new FindOptions
{
Collation = new Collation(
locale: "en",
strength: new Optional<CollationStrength?>(CollationStrength.Secondary)
),
}
);
}
public async Task SaveAiAnalyzeResultAsync(string[]? path, string name, string analyzeResult)
{
var codeNote = await BuildFluent(path, name, out var 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 filter = Builders<CodeNote>.Filter.Eq(x => x.Path, pathStr);
var list = await repository
.SearchFor(
filter,
new FindOptions
{
Collation = new Collation(
locale: "en",
strength: new Optional<CollationStrength?>(CollationStrength.Secondary)
),
}
)
.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 filter = BuildFilter(path, name, out _);
await repository.DeleteAsync(filter);
}
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
上述代码定义了一个名为 CodeNoteService 的服务类,主要用于管理代码笔记(CodeNote)的 CRUD(创建、读取、更新、删除)操作。这个服务类实现了 ICodeNoteService 接口,并依赖于多个组件,如 IRepository<CodeNote>、IMapper、ILogger<CodeNoteService>、IConfiguration 和 IHybridCachingProvider。以下是该类的主要功能和方法的详细解释:
主要功能
保存笔记 (
SaveNoteAsync):- 接收路径、名称和笔记内容作为参数。
- 检查是否已经存在具有相同名称和路径的笔记。
- 如果不存在,则创建一个新的
CodeNote实体并插入到数据库中。 - 如果存在,则更新该笔记的内容和最后更新时间。
查找笔记 (
FindAsync):- 根据路径和名称查找特定的笔记。
- 如果找到,使用
IMapper将CodeNote实体映射到视图模型VmCodeNote并返回;如果未找到,则返回null。
保存 AI 分析结果 (
SaveAiAnalyzeResultAsync):- 接收路径、名称和分析结果作为参数。
- 检查是否已经存在具有相同名称和路径的笔记。
- 如果不存在,则创建一个新的
CodeNote实体并插入到数据库中。 - 如果存在,则更新该笔记的 AI 分析结果和最后更新时间。
- 在每次保存后,调用
ClearCacheAsync方法清除相关缓存。
获取笔记 (
GetNoteAsync):- 根据路径获取所有相关的笔记。
- 使用
IMapper将CodeNote实体列表映射到VmCodeNote列表并返回。
获取所有笔记 (
GetAllNoteAsync):- 获取数据库中所有的笔记,并将其映射到
VmCodeNote列表返回。
- 获取数据库中所有的笔记,并将其映射到
删除笔记 (
DeleteAsync):- 根据路径和名称删除特定的笔记。
辅助方法
GetPathStr:
- 将路径数组转换为字符串,使用斜杠(
/)连接各个部分。如果路径为空或为null,则返回空字符串。
- 将路径数组转换为字符串,使用斜杠(
ClearCacheAsync:
- 清除与特定路径和名称相关的缓存。它从配置中获取
CodeView的设置,并生成缓存键以便于删除。
- 清除与特定路径和名称相关的缓存。它从配置中获取
日志记录
在 GetNoteAsync 方法中,使用 ILogger 记录查询耗时,便于调试和性能监控。
总结
CodeNoteService 类提供了一系列方法来管理代码笔记的生命周期,包括创建、更新、查找、删除和缓存管理。它通过依赖注入的方式使用了多个服务,确保了代码的模块化和可测试性。
评论加载中...