UNIVPLMDataIntegration/Admin.NET/Admin.NET.Core/Ai/Services/DataBase/ChatChannelManager.cs

63 lines
2.4 KiB
C#

using System.Threading.Channels;
using Admin.NET.Core.Ai.Services.DataBase.Dto;
using Admin.NET.Core.Ai.Enums;
using Microsoft.Extensions.DependencyInjection;
namespace Admin.NET.Core.Ai.Services.DataBase;
public class ChatChannelManager : ISingleton
{
private readonly Channel<DataActionInput> _channel;
private readonly ILogger<ChatChannelManager> _logger;
private readonly IServiceProvider _serviceProvider;
public ChatChannelManager(
ILogger<ChatChannelManager> logger,
IServiceProvider serviceProvider)
{
_logger = logger;
_serviceProvider = serviceProvider;
_channel = Channel.CreateBounded<DataActionInput>(new BoundedChannelOptions(1000)
{
FullMode = BoundedChannelFullMode.Wait
});
_ = Task.Run(async () =>
{
while (await _channel.Reader.WaitToReadAsync())
{
var action = await _channel.Reader.ReadAsync();
try
{
// 在需要时创建新的作用域
using var scope = _serviceProvider.CreateScope();
var chatChannelActionService = scope.ServiceProvider.GetRequiredService<ChatChannelActionService>();
switch (action.ActionType)
{
case ChatActionEnums.Append:
await chatChannelActionService.AppendAsync(action.Item);
break;
case ChatActionEnums.AppendItem:
await chatChannelActionService.AppendItemAsync(action.Item);
break;
case ChatActionEnums.DeleteAll:
await chatChannelActionService.DeleteAllAsync(action.Item);
break;
case ChatActionEnums.RenameSummary:
await chatChannelActionService.RenameSummaryAsync(action.Item);
break;
}
}
catch (Exception ex)
{
_logger.LogError(ex, "处理数据库操作时发生错误");
}
}
});
}
public ChannelReader<DataActionInput> ActionReader => _channel.Reader;
public ChannelWriter<DataActionInput> ActionWriter => _channel.Writer;
}