AutoGen-03-.NET-Core-概览
模块职责
核心职责
AutoGen.Core是AutoGen框架的.NET实现核心模块,提供强类型、高性能的多代理系统基础设施。主要职责包括:
- 代理生命周期管理:基于.NET的强类型代理抽象和实例管理
- 消息传递系统:利用.NET Task-based异步模式实现高效消息传递
- 类型安全保证:编译时类型检查,减少运行时错误
- 企业级特性:依赖注入、配置管理、日志记录、性能监控
- 跨平台支持:支持Windows、Linux、macOS多平台部署
输入与输出
- 输入:.NET配置对象、强类型消息、代理工厂函数、服务配置
- 输出:代理响应结果、任务执行状态、性能指标、诊断信息
上下游依赖
- 上游依赖:.NET 8+、Microsoft.Extensions.*(DI、Config、Logging)、gRPC.NET
- 下游调用方:AutoGen应用程序、ASP.NET Core集成、控制台应用
模块架构图
flowchart TB
subgraph ".NET应用层"
ConsoleApp[控制台应用]
WebAPI[ASP.NET Core API]
WinService[Windows服务]
BlazorApp[Blazor应用]
end
subgraph "AutoGen.NET框架层"
subgraph "高层API"
AgentBuilder[AgentBuilder<br/>代理构建器]
AgentHost[IAgentHost<br/>代理宿主接口]
MessageBus[IMessageBus<br/>消息总线]
end
subgraph "代理抽象"
IAgent[IAgent<br/>代理接口]
AgentBase[AgentBase<br/>代理基类]
TypedAgent[TypedAgent<T><br/>强类型代理]
end
subgraph "消息系统"
IMessage[IMessage<br/>消息接口]
MessageHandler[MessageHandler<T><br/>消息处理器]
MessageRouter[MessageRouter<br/>消息路由器]
end
end
subgraph "Microsoft.Extensions基础设施"
DI[依赖注入容器<br/>IServiceCollection]
Config[配置系统<br/>IConfiguration]
Logging[日志系统<br/>ILogger]
Hosting[托管服务<br/>IHostedService]
end
subgraph ".NET运行时"
TaskScheduler[Task调度器]
ThreadPool[线程池]
GC[垃圾回收器]
JIT[即时编译器]
end
ConsoleApp --> AgentBuilder
WebAPI --> AgentHost
WinService --> Hosting
BlazorApp --> MessageBus
AgentBuilder --> IAgent
AgentHost --> AgentBase
MessageBus --> MessageRouter
IAgent --> TypedAgent
AgentBase --> MessageHandler
MessageRouter --> IMessage
AgentBuilder --> DI
AgentHost --> Config
MessageHandler --> Logging
MessageRouter --> Hosting
DI --> TaskScheduler
Config --> ThreadPool
Logging --> GC
Hosting --> JIT
架构特点说明
强类型设计:
- 所有消息和代理都是强类型,编译时检查类型安全
- 泛型约束确保消息处理器的类型匹配
- 避免Python动态类型可能导致的运行时错误
企业级集成:
- 完全集成Microsoft.Extensions生态系统
- 支持ASP.NET Core依赖注入和配置
- 内置健康检查、指标收集、日志记录
高性能异步:
- 基于ValueTask的零分配异步操作
- 利用.NET ThreadPool进行工作负载均衡
- 支持取消令牌和超时控制
核心API设计
IAgent接口
public interface IAgent
{
string Name { get; }
string Description { get; }
ValueTask<IMessage> HandleAsync<TMessage>(
TMessage message,
CancellationToken cancellationToken = default)
where TMessage : class, IMessage;
ValueTask InitializeAsync(CancellationToken cancellationToken = default);
ValueTask DisposeAsync();
}
AgentBase基类
public abstract class AgentBase : IAgent, IAsyncDisposable
{
protected AgentBase(string name, string description, ILogger logger)
{
Name = name;
Description = description;
Logger = logger;
}
public string Name { get; }
public string Description { get; }
protected ILogger Logger { get; }
public abstract ValueTask<IMessage> HandleAsync<TMessage>(
TMessage message,
CancellationToken cancellationToken = default)
where TMessage : class, IMessage;
public virtual ValueTask InitializeAsync(CancellationToken cancellationToken = default)
{
Logger.LogInformation("初始化代理 {AgentName}", Name);
return ValueTask.CompletedTask;
}
public virtual async ValueTask DisposeAsync()
{
Logger.LogInformation("释放代理 {AgentName}", Name);
// 清理资源
GC.SuppressFinalize(this);
}
}
强类型消息处理
public class TaskMessage : IMessage
{
public string TaskId { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public TaskPriority Priority { get; set; } = TaskPriority.Normal;
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}
public class TaskResponseMessage : IMessage
{
public string TaskId { get; set; } = string.Empty;
public string Result { get; set; } = string.Empty;
public TaskStatus Status { get; set; }
public TimeSpan ProcessingTime { get; set; }
}
// 强类型代理实现
public class TaskProcessorAgent : AgentBase
{
public TaskProcessorAgent(ILogger<TaskProcessorAgent> logger)
: base("TaskProcessor", "处理任务的专用代理", logger)
{
}
public override async ValueTask<IMessage> HandleAsync<TMessage>(
TMessage message,
CancellationToken cancellationToken = default)
{
// 编译时类型检查
return message switch
{
TaskMessage taskMsg => await ProcessTaskAsync(taskMsg, cancellationToken),
_ => throw new NotSupportedException($"不支持的消息类型: {typeof(TMessage)}")
};
}
private async ValueTask<TaskResponseMessage> ProcessTaskAsync(
TaskMessage message,
CancellationToken cancellationToken)
{
Logger.LogInformation("开始处理任务 {TaskId}", message.TaskId);
var stopwatch = Stopwatch.StartNew();
try
{
// 模拟任务处理
await Task.Delay(Random.Shared.Next(100, 1000), cancellationToken);
stopwatch.Stop();
return new TaskResponseMessage
{
TaskId = message.TaskId,
Result = $"任务 {message.TaskId} 处理完成",
Status = TaskStatus.Completed,
ProcessingTime = stopwatch.Elapsed
};
}
catch (OperationCanceledException)
{
Logger.LogWarning("任务 {TaskId} 被取消", message.TaskId);
throw;
}
catch (Exception ex)
{
Logger.LogError(ex, "任务 {TaskId} 处理失败", message.TaskId);
return new TaskResponseMessage
{
TaskId = message.TaskId,
Result = $"任务处理失败: {ex.Message}",
Status = TaskStatus.Failed,
ProcessingTime = stopwatch.Elapsed
};
}
}
}
依赖注入集成
服务注册
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddAutoGen(
this IServiceCollection services,
Action<AutoGenOptions> configure)
{
// 配置选项
services.Configure(configure);
// 注册核心服务
services.AddSingleton<IMessageBus, MessageBus>();
services.AddSingleton<IAgentHost, AgentHost>();
services.AddSingleton<IMessageRouter, MessageRouter>();
// 注册托管服务
services.AddHostedService<AgentHostService>();
// 注册健康检查
services.AddHealthChecks()
.AddCheck<AgentHealthCheck>("agents");
return services;
}
public static IServiceCollection AddAgent<TAgent>(
this IServiceCollection services)
where TAgent : class, IAgent
{
services.AddSingleton<TAgent>();
services.AddSingleton<IAgent>(provider => provider.GetRequiredService<TAgent>());
return services;
}
}
配置系统
public class AutoGenOptions
{
public const string SectionName = "AutoGen";
public int MaxConcurrentMessages { get; set; } = 100;
public TimeSpan DefaultTimeout { get; set; } = TimeSpan.FromSeconds(30);
public bool EnableMetrics { get; set; } = true;
public bool EnableDistributedTracing { get; set; } = false;
public LogLevel MinimumLogLevel { get; set; } = LogLevel.Information;
public Dictionary<string, AgentConfiguration> Agents { get; set; } = new();
}
public class AgentConfiguration
{
public string Name { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public bool Enabled { get; set; } = true;
public Dictionary<string, object> Properties { get; set; } = new();
}
// appsettings.json配置示例
/*
{
"AutoGen": {
"MaxConcurrentMessages": 200,
"DefaultTimeout": "00:01:00",
"EnableMetrics": true,
"Agents": {
"TaskProcessor": {
"Name": "TaskProcessor",
"Description": "处理任务的专用代理",
"Enabled": true,
"Properties": {
"MaxRetries": 3,
"BatchSize": 10
}
}
}
}
}
*/
完整应用示例
// Program.cs
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
var builder = Host.CreateApplicationBuilder(args);
// 配置AutoGen
builder.Services.AddAutoGen(options =>
{
options.MaxConcurrentMessages = 200;
options.DefaultTimeout = TimeSpan.FromMinutes(1);
options.EnableMetrics = true;
});
// 注册代理
builder.Services.AddAgent<TaskProcessorAgent>();
builder.Services.AddAgent<NotificationAgent>();
// 配置日志
builder.Services.AddLogging(logging =>
{
logging.AddConsole();
logging.AddDebug();
logging.SetMinimumLevel(LogLevel.Information);
});
var app = builder.Build();
// 启动应用
await app.RunAsync();
// 托管服务实现
public class AgentHostService : BackgroundService
{
private readonly IAgentHost _agentHost;
private readonly ILogger<AgentHostService> _logger;
public AgentHostService(IAgentHost agentHost, ILogger<AgentHostService> logger)
{
_agentHost = agentHost;
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("启动代理宿主服务");
// 初始化所有代理
await _agentHost.StartAsync(stoppingToken);
// 等待停止信号
await Task.Delay(Timeout.Infinite, stoppingToken);
}
public override async Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("停止代理宿主服务");
await _agentHost.StopAsync(cancellationToken);
await base.StopAsync(cancellationToken);
}
}
性能特征
内存管理
- 零分配异步:使用ValueTask避免不必要的内存分配
- 对象池:重用频繁创建的对象(消息、上下文等)
- 弱引用缓存:允许GC回收不活跃的代理实例
并发性能
- 无锁数据结构:使用ConcurrentQueue、ConcurrentDictionary
- 线程池优化:合理配置ThreadPool参数
- 取消令牌传播:支持优雅的操作取消
监控指标
// 内置性能计数器
public static class AutoGenMetrics
{
private static readonly Counter<int> _messagesProcessed =
Meter.CreateCounter<int>("autogen.messages.processed");
private static readonly Histogram<double> _processingDuration =
Meter.CreateHistogram<double>("autogen.processing.duration");
private static readonly Gauge<int> _activeAgents =
Meter.CreateGauge<int>("autogen.agents.active");
public static void RecordMessageProcessed(string agentName)
{
_messagesProcessed.Add(1, KeyValuePair.Create("agent", agentName));
}
public static void RecordProcessingDuration(double milliseconds, string agentName)
{
_processingDuration.Record(milliseconds, KeyValuePair.Create("agent", agentName));
}
}