.NET+AI | Agent | 构建插件系统(7)
目录一句话简介 核心价值 什么是插件系统 业务场景 实现方式1. 基础插件类2. 依赖注入管理3. 抽象基类统一实现4. 企业级接口标准 多插件集成 选择性暴露机制 企业级最佳实践1. 架构选型建议2. 依赖注入最佳实践3. 插件开发规范 架构演进对比 总结上一篇一句话简介学习如何通过插件系统设计企业级 AI Agent 架构使用抽象基类和接口标准化实现模块化、可扩展的智能应用。 核心价值✅模块化设计按功能划分插件独立开发和维护✅依赖注入使用 DI 容器管理插件依赖关系✅选择性暴露精确控制哪些方法暴露给 AI Agent✅企业级标准通过接口和抽象基类统一插件开发规范 什么是插件系统插件系统是一种软件架构模式允许在不修改核心代码的情况下通过添加、移除或替换插件来扩展应用功能。核心优势特性价值可扩展性新功能通过插件添加无需修改核心代码可维护性插件独立开发和测试降低系统复杂度️灵活配置按需启用/禁用插件满足不同场景需求团队协作不同团队开发不同插件提高开发效率 业务场景某企业需要构建智能工作助手系统为员工提供️天气查询为出差人员提供目的地天气信息⏰时间查询支持不同时区的时间查询跨国团队协作办公协作会议室预订、通讯录查询等未来扩展财务管理报销查询、预算管理等未来扩展技术挑战功能模块持续增加、不同团队负责不同功能、需要独立测试和部署。 实现方式1. 基础插件类最简单的插件实现public sealedclassWeatherPlugin { [Description(查询指定城市的天气信息)] public string GetWeather( [Description(城市名称如北京、上海)] string location) { return$ {location}晴转多云温度 15°C空气质量良好; } } // 注册插件 var weatherPlugin new WeatherPlugin(); var tools new[] { AIFunctionFactory.Create(weatherPlugin.GetWeather) };问题每个插件都需要手动处理工具注册代码重复。2. 依赖注入管理通过依赖注入解耦插件和服务// 1. 定义服务类 publicsealedclassWeatherProvider { public string GetWeather(string location) { return$ {location} 天气数据...; } } // 2. 插件通过构造函数注入 publicsealedclassWeatherPlugin { privatereadonly WeatherProvider _provider; public WeatherPlugin(WeatherProvider provider) { _provider provider; } [Description(查询天气)] public string GetWeather([Description(城市)] string location) { return _provider.GetWeather(location); } } // 3. 使用 DI 容器管理 services.AddSingletonWeatherProvider(); services.AddSingletonWeatherPlugin();优势代码更清晰易于测试和替换实现。3. 抽象基类统一实现通过抽象基类减少重复代码// 1. 定义抽象基类 publicabstractclassAgentPluginBase { // 子类只需重写这个方法声明要暴露的工具 protected abstract IEnumerableDelegate GetToolMethods(); // 基类统一实现 AsAITools() public IEnumerableAITool AsAITools() { return GetToolMethods() .Select(method AIFunctionFactory.Create(method)); } } // 2. 插件继承基类 publicsealedclassWeatherPlugin : AgentPluginBase { privatereadonly WeatherProvider _provider; public WeatherPlugin(WeatherProvider provider) { _provider provider; } [Description(查询天气)] public string GetWeather([Description(城市)] string location) { return _provider.GetWeather(location); } // 只需声明要暴露的方法 protected override IEnumerableDelegate GetToolMethods() { yieldreturnthis.GetWeather; } }优势✅ 减少 33% 代码量✅ 统一实现模式✅ 保持选择性暴露能力4. 企业级接口标准通过接口实现完全标准化// 1. 定义插件接口 publicinterfaceIAgentPlugin { string PluginName { get; } IEnumerableAITool AsAITools(); object GetPluginInfo(); } // 2. 抽象基类实现接口 publicabstractclassStandardAgentPluginBase : IAgentPlugin { publicvirtualstring PluginName GetType().Name; protected abstract IEnumerableDelegate GetToolMethods(); public IEnumerableAITool AsAITools() { return GetToolMethods() .Select(method AIFunctionFactory.Create(method)); } public virtual object GetPluginInfo() { returnnew { Name PluginName }; } } // 3. 插件实现接口 publicsealedclassStandardWeatherPlugin : StandardAgentPluginBase { privatereadonly WeatherProvider _provider; publicoverridestring PluginName 天气查询插件; public StandardWeatherPlugin(WeatherProvider provider) { _provider provider; } [Description(查询天气)] public string GetWeather([Description(城市)] string location) { return _provider.GetWeather(location); } protected override IEnumerableDelegate GetToolMethods() { yieldreturnthis.GetWeather; } } 多插件集成统一管理所有插件// 1. 注册所有服务和插件 services.AddSingletonWeatherProvider(); services.AddSingletonCurrentTimeProvider(); services.AddSingletonIAgentPlugin, StandardWeatherPlugin(); services.AddSingletonIAgentPlugin, StandardTimePlugin(); var serviceProvider services.BuildServiceProvider(); // 2. 通过接口统一获取所有插件 var plugins serviceProvider.GetServicesIAgentPlugin(); // 3. 自动收集所有工具 var tools plugins.SelectMany(p p.AsAITools()).ToArray(); // 4. 创建 Agent var agent chatClient.CreateAIAgent( instructions: 你是企业智能工作助手, name: WorkAssistant, tools: tools, services: serviceProvider );架构图 选择性暴露机制通过GetToolMethods()精确控制哪些方法暴露给 AIpublic sealedclassWeatherPlugin : StandardAgentPluginBase { // ✅ 暴露给 AI [Description(查询天气)] public string GetWeather(string location) { } // ❌ 不暴露内部管理方法 public void UpdateWeatherCache() { } // ❌ 不暴露敏感操作 public void SetApiKey(string apiKey) { } // 只返回要暴露的方法 protected override IEnumerableDelegate GetToolMethods() { yieldreturnthis.GetWeather; } }流程图 企业级最佳实践1. 架构选型建议项目规模推荐架构理由小型项目/原型直接函数快速开发无需过度设计中型项目基础插件类基本模块化易于理解大型项目抽象基类减少重复统一标准企业级应用接口基类完全标准化长期可维护2. 依赖注入最佳实践// ✅ 推荐通过接口注册 services.AddSingletonIAgentPlugin, WeatherPlugin(); services.AddSingletonIAgentPlugin, TimePlugin(); // ✅ 推荐统一解析所有插件 var plugins serviceProvider.GetServicesIAgentPlugin();3. 插件开发规范必须遵循✅ 继承StandardAgentPluginBase基类✅ 实现IAgentPlugin接口✅ 重写GetToolMethods()方法声明工具✅ 使用[Description]特性描述方法和参数✅ 通过构造函数注入依赖禁止事项❌ 在GetToolMethods()中暴露敏感操作❌ 直接在插件中创建服务实例❌ 跳过接口直接使用具体类 架构演进对比阶段代码量复用性标准化适用场景直接函数30行/插件⭐⭐快速原型基础插件类30行/插件⭐⭐⭐⭐中型项目抽象基类20行/插件⭐⭐⭐⭐⭐⭐大型项目接口基类20行/插件⭐⭐⭐⭐⭐⭐⭐⭐企业级演进路径 总结✅插件系统价值模块化设计独立开发按需扩展✅依赖注入使用 DI 容器管理插件依赖提高可测试性✅抽象基类统一实现AsAITools()减少 33% 代码量✅选择性暴露通过GetToolMethods()精确控制 AI 能力边界✅企业级标准接口基类架构实现完全标准化✅多插件集成通过IAgentPlugin接口统一管理所有插件下一篇引入地址