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

📅 2026/7/17 23:58:41
第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);// 非流式调用TaskChatMessageSendMessageAsync(stringuserMessage,ChatHistorychatHistory,AIProviderConfigconfig,CancellationTokencancellationToken=default);TaskChatMessageSendMessageAsync(stringuserMessage,ChatHistorychatHistory,AIProviderConfigconfig,PromptExecutionSettings?executionSettings,CancellationTokencancellationToken=default);// 流式调用(IAsyncEnumerable)IAsyncEnumerableChatMessageSendMessageStreamAsync(stringuserMessage,ChatHistorychatHistory,AIProviderConfigconfig,CancellationTokencancellationToken=default);IAsyncEnumerableChatMessageSendMessageStreamAsync(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);IReadOnlyListIAIProviderServiceGetAvailableProviders();}三个方法的定位很清晰:方法用途适用场景CreateProvider(AIProviderType)按枚举类型创建用户在UI下拉菜单选择了"DeepSeek"CreateProvider(AIProviderConfig)按配置自动匹配从配置文件读取provider配置GetAvailableProviders()获取所有可用Provider列表UI展示可用模型列表3.2 工厂实现// AIProviderFactory.cspublicclassAIProviderFactory:IAIProviderFactory{private