news 2026/7/17 23:58:35

第2系列_第2期_.NET C# 多AI Provider统一接入方案_工厂模式实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第2系列_第2期_.NET C# 多AI Provider统一接入方案_工厂模式实战

.NET C# Kernel 构建实战:多AI提供商统一接入方案

系列:.NET C# Semantic Kernel 集成深度解析 ②/6
难度:⭐⭐⭐(进阶源码,需.NET基础)
源码仓库:github.com/zongge0812/zonggeAgent
适用环境:.NET 9.0 + WPF


一、引言

一个桌面AI工作台要支持多个AI模型,最直接的挑战是:每个AI提供商的API签名、认证方式、连接器都不相同

对接方式问题
直接硬编码每新增一个模型就要改一遍调用代码
if-else 分支6个Provider → 6个分支 → 代码膨胀不可维护
各自对接流式/非流式逻辑重复实现

本项目的方案是工厂模式 + 模板方法模式的组合:

┌──────────────────────────────────────────────────────────────┐ │ IAIProviderService(接口契约:统一 SendMessageAsync) │ │ ↑ implements │ │ BaseAIProviderService(抽象基类:模板方法定义骨架) │ │ ↑ extends │ │ DeepSeek / OpenAI / Claude / Qwen / Ollama / Custom │ │ │ │ AIProviderFactory(工厂:根据类型返回对应Provider实例) │ │ IAIProviderFactory(工厂接口:CreateProvider + 注册) │ └──────────────────────────────────────────────────────────────┘

二、统一接口契约:IAIProviderService

先从顶层接口看起。所有Provider都实现同一个接口:

// IAIProviderService.cspublicinterfaceIAIProviderService{AIProviderTypeProviderType{get;}stringDisplayName{get;}boolCanHandle(AIProviderConfigconfig);// 非流式调用Task<ChatMessage>SendMessageAsync(stringuserMessage,ChatHistorychatHistory,AIProviderConfigconfig,CancellationTokencancellationToken=default);Task<ChatMessage>SendMessageAsync(stringuserMessage,ChatHistorychatHistory,AIProviderConfigconfig,PromptExecutionSettings?executionSettings,CancellationTokencancellationToken=default);// 流式调用(IAsyncEnumerable)IAsyncEnumerable<ChatMessage>SendMessageStreamAsync(stringuserMessage,ChatHistorychatHistory,AIProviderConfigconfig,CancellationTokencancellationToken=default);IAsyncEnumerable<ChatMessage>SendMessageStreamAsync(stringuserMessage,ChatHistorychatHistory,AIProviderConfigconfig,PromptExecutionSettings?executionSettings,CancellationTokencancellationToken=default);}

设计要点:

设计决策理由
流式与非流式各提供2个重载一个使用默认ExecutionSettings,一个支持自定义配置
参数传递AIProviderConfig统一配置对象包含 BaseUrl、ApiKey、ModelId、MaxTokens、Temperature
返回ChatMessage(自定义模型)避免直接暴露SK的ChatMessageContent,解耦外部依赖

三、工厂模式:AIProviderFactory

工厂类的完整源码已在第①期提及,这里做逐行拆解

3.1 工厂接口

publicinterfaceIAIProviderFactory{IAIProviderService?CreateProvider(AIProviderTypeproviderType);IAIProviderService?CreateProvider(AIProviderConfigconfig);IReadOnlyList<IAIProviderService>GetAvailableProviders();}

三个方法的定位很清晰:

方法用途适用场景
CreateProvider(AIProviderType)按枚举类型创建用户在UI下拉菜单选择了"DeepSeek"
CreateProvider(AIProviderConfig)按配置自动匹配从配置文件读取provider配置
GetAvailableProviders()获取所有可用Provider列表UI展示可用模型列表

3.2 工厂实现

// AIProviderFactory.cspublicclassAIProviderFactory:IAIProviderFactory{private
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/17 23:57:50

GitHub开源项目日报 · 2026年7月15日 · AI编码代理技能集爆火

mattpocock/skills 以日增超千星的速度领跑,这套为 AI 编码代理设计的可组合技能集已达 17 万星。榜单整体偏向 AI 工具,万星以上项目多达 9 个,OpenCut 开源视频编辑器、awesome-llm-apps 的 RAG 应用模板库和 marketingskills 营销技能集等均超 3 万星且日增过百。Vibe-Tr…

作者头像 李华
网站建设 2026/7/17 23:55:47

中国限定宝可梦魔方:收藏价值与鉴别指南

这次我们来看一个特殊的宝可梦收藏品——中国限定版魔方。这个由知名创作者Tingman分享的"最稀有宝可梦魔方"引起了收藏爱好者的广泛关注&#xff0c;它不仅设计独特&#xff0c;更重要的是只有在中国市场才能购买到。作为宝可梦正版授权产品&#xff0c;这款魔方融合…

作者头像 李华
网站建设 2026/7/17 23:55:19

三步实现手机号码自动定位:高效实用的号码归属地查询系统

三步实现手机号码自动定位&#xff1a;高效实用的号码归属地查询系统 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_m…

作者头像 李华
网站建设 2026/7/17 23:54:56

别只盯着 Agent 编排,权限与日志才是大模型上线的生死线

聊《大模型岗位变了&#xff0c;运维工程师该补的还是算法吗&#xff1f;》之前&#xff0c;先说一句实在的&#xff1a;别急着背概念&#xff0c;先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚&#xff1a;看完之后&#xff0c;你应该能判断这件事值不值…

作者头像 李华
网站建设 2026/7/17 23:40:15

Claude Code本地部署全指南:Node.js+Git+VS Code三步打通AI编程通路

1. 项目概述&#xff1a;这不是装个插件&#xff0c;而是搭一条通往AI编程助手的本地通路 “Claude Code 小白级安装指南和必备工具”——这个标题里藏着一个被严重低估的真相&#xff1a;它根本不是教你怎么点几下鼠标装个VS Code插件。我带过二十多个刚转行的前端新人、帮三个…

作者头像 李华
网站建设 2026/7/17 23:39:29

AI编程实战:7天零基础开发三个项目

1. 项目概述&#xff1a;AI编程效率革命三年前我第一次接触AI编程时&#xff0c;花了整整两周才完成一个简单的天气查询应用。如今借助现代AI工具&#xff0c;同样的功能只需要15分钟对话就能实现。这个转变让我意识到&#xff0c;AI编程正在重塑软件开发的基本范式——不再需要…

作者头像 李华