Azure SDK for .NET - 专业代码生成与开发指南

news/2025/11/18 6:05:22/文章来源:https://www.cnblogs.com/qife122/p/19235356

Azure SDK for .NET

Azure SDK for .NET 是一个功能强大的开发工具包,专门用于构建与Azure服务交互的.NET应用程序。该项目提供了完整的代码生成解决方案,能够从TypeSpec或Swagger规范自动生成符合Azure SDK设计指南的高质量客户端库。

功能特性

核心代码生成能力

  • 多规范支持: 支持TypeSpec和Swagger两种API规范格式
  • 自动客户端生成: 从API规范自动生成强类型的客户端代码
  • 协议方法生成: 自动生成基于HTTP协议的底层操作方法
  • 便捷方法生成: 提供类型安全的便捷API层,提升开发体验

开发体验优化

  • 统一设计指南: 所有生成的代码遵循Azure SDK for .NET设计规范
  • 智能序列化: 内置System.Text.Json序列化支持
  • 分布式追踪: 自动集成客户端诊断和追踪功能
  • 异步支持: 完整的异步编程模式支持

工程化特性

  • 测试框架集成: 自动生成测试项目和示例代码
  • 包管理: 完整的NuGet包生成和版本管理
  • AOT兼容性: 支持原生AOT部署的兼容性测试
  • 多目标框架: 支持.NET Standard和多个.NET版本

安装指南

环境要求

  • .NET SDK: 需要.NET 9.0.102 SDK或更高版本
  • Visual Studio: 2022版本(Community或更高),安装.NET桌面开发工作负载
  • Node.js: 22.x.x版本(用于代码生成)
  • PowerShell: 7.0或更高版本
  • Git: 最新版本

项目设置

  1. 克隆仓库并切换到主题分支:
git clone https://github.com/Azure/azure-sdk-for-net.git
cd azure-sdk-for-net
  1. 安装必要的工具和依赖:
dotnet restore
  1. 构建整个仓库:
dotnet build build.proj

构建特定服务

要构建单个服务,使用scope参数:

dotnet build build.proj /p:Scope=servicebus

使用说明

生成新的SDK包

使用TypeSpec生成新的数据平面SDK包:

pwsh eng/scripts/automation/Invoke-TypeSpecDataPlaneGenerateSDKPackage.ps1 `-sdkFolder /home/azure-sdk-for-net/sdk/anomalyDetector/Azure.AI.AnomalyDetector `-typespecSpecDirectory specification/cognitiveservices/AnomalyDetector `-commit ac8e06a2ed0fc1c54663c98f12c8a073f8026b90

生成代码

进入项目src目录并生成代码:

cd sdk/<service>/<package>/src
dotnet build /t:GenerateCode

基本客户端使用

// 使用Azure Key Credential认证
var client = new BasicTypeSpecClient(new Uri("https://your-endpoint.azure.com"),new AzureKeyCredential("your-api-key"));// 调用服务方法
var response = await client.SayHiAsync("head-param", "query-param");

核心代码

客户端生成核心逻辑

// AzureClientGenerator.cs - 主要的代码生成器
[Export(typeof(CodeModelGenerator))]
[ExportMetadata(GeneratorMetadataName, nameof(AzureClientGenerator))]
public class AzureClientGenerator : ScmCodeModelGenerator
{private static AzureClientGenerator? _instance;public AzureClientGenerator(GeneratorContext context) : base(context){TypeFactory = new AzureTypeFactory();_instance = this;}protected override void Configure(){base.Configure();// 包含Azure.Core引用AddMetadataReference(typeof(Response).Assembly.Location);// 添加自定义访问器AddVisitor(new ModelFactoryRenamerVisitor());AddVisitor(new NamespaceVisitor());AddVisitor(new DistributedTracingVisitor());AddVisitor(new LroVisitor());}
}

类型工厂实现

// AzureTypeFactory.cs - 类型创建工厂
public class AzureTypeFactory : ScmTypeFactory
{public override IClientResponseApi ClientResponseApi => AzureClientResponseProvider.Instance;public override IHttpResponseApi HttpResponseApi => AzureResponseProvider.Instance;public override IClientPipelineApi ClientPipelineApi => HttpPipelineProvider.Instance;protected internal virtual IReadOnlyList<CSharpProjectWriter.CSProjPackage> AzureDependencyPackages =>[new("Azure.Core", "1.0.0"),new("System.Text.Json", "8.0.0")];
}

HTTP管道构建器

// HttpPipelineProvider.cs - HTTP管道配置
public record HttpPipelineProvider : ClientPipelineApi
{public override ValueExpression Create(ValueExpression options, ValueExpression perRetryPolicies)=> Static(typeof(HttpPipelineBuilder)).Invoke(nameof(HttpPipelineBuilder.Build), [options, perRetryPolicies]);public override MethodBodyStatement[] CreateMessage(HttpRequestOptionsApi requestOptions,ValueExpression uri,ScopedApi<string> method,ValueExpression requestContent){return[Declare("message", Original.Invoke("CreateMessage", requestOptions), out ScopedApi<HttpMessage> message),message.Request().SetMethod(method),message.Request().SetUri(uri),requestContent != Null ? message.Request().Property("Content").Assign(requestContent).Terminate(): MethodBodyStatement.Empty,ApplyPerCallPolicies(message),Return(message)];}
}

响应处理系统

// AzureClientResponseProvider.cs - 客户端响应处理
public record AzureClientResponseProvider : ClientResponseApi
{public override CSharpType ClientResponseType => typeof(Response);public override CSharpType ClientResponseOfTType => typeof(Response<>);public override ValueExpression CreateAsync(HttpResponseApi response)=> New.Instance(ClientResponseExceptionType, [response]);public override ValueExpression FromValue(ValueExpression valueExpression, HttpResponseApi response)=> Static(ClientResponseType).Invoke(nameof(FromValue), [valueExpression, response]);
}

分页集合实现

// AzureCollectionResultDefinition.cs - 分页集合处理
public class AzureCollectionResultDefinition : CollectionResultDefinition
{protected override string RequestOptionsFieldName => "_context";public AzureCollectionResultDefinition(ClientProvider client, InputPagingServiceMethod serviceMethod, CSharpType? itemModelType, bool isAsync) : base(client, serviceMethod, itemModelType, isAsync){_operation = serviceMethod.Operation;_itemModelType = itemModelType;_paging = serviceMethod.Paging;_scopeName = client.GetScopeName(_operation);_getNextResponseMethodName = $"GetNextResponse{(isAsync ? "Async" : "")}";_isProtocol = true;}// 分页迭代逻辑public override async IAsyncEnumerable<Page<BinaryData>> AsPages(string continuationToken, int? pageSizeHint){string nextPage = continuationToken ?? _token;while (true){Response response = await GetNextResponseAsync(pageSizeHint, nextPage);if (response is null) yield break;var result = (ListWithContinuationTokenResponse)response;var items = result.Things.Select(item => BinaryData.FromObjectAsJson(item)).ToList();yield return Page<BinaryData>.FromValues(items, nextPage, response);nextPage = result.NextToken;if (nextPage == null) yield break;}}
}

这些核心组件共同构成了Azure SDK for .NET的强大代码生成能力,确保了生成的客户端库具有一致性、高性能和良好的开发体验。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/968499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 代表什么意思

在 Linux 系统中, + #引号 + Linux + #引号 + 是一个操作系统内核的名字,由芬兰程序员 Linus Torvalds 开发。Linux 是一个开源的、自由的、可定制的、多任务、多用户、稳定可靠的 Unix-like 操作系统。 简要解…

linux 代表什么

+ #引号 + Linux + #引号 + 是一个开源的自由软件操作系统,由林纳斯托瓦兹(Linus Torvalds)在1991年创建。它最初是作为 Unix 的一个变种开发的,但后来发展成为一个独立的、完全开源的系统。 Linux 的主要特点…

AI元人文实践:价值原语化——法律法规代码化(整合)

AI元人文实践:价值原语化——法律法规代码化(整合) ——兼与杨垠红、高天《算法何以向上向善而行?》一文对话 岐金兰 2025年11月18日摘要 本文旨在探讨价值原语化理论如何为法律法规代码化提供可行的实践路径。文章…

linux mv命令

mv 是 Linux 中一个非常常用的命令,用于移动文件或目录,也可以用于重命名文件或目录。它是一个非常强大的命令,适用于大多数 Linux 发行版。? mv 命令的基本用法 1. 移动文件或目录 mv [选项] 源路径 目标路径源路…

libjpeg linux

libjpeg 是一个用于处理 JPEG 图像的 C 库,常用于 Linux 系统中进行图像处理、压缩或解码。它通常与 libpng、libtiff 等图像处理库一起使用。 一、安装 libjpeg(Linux) 在大多数 Linux 发行版中,libjpeg 通常已经…

left函数sql能否实现字符串截取

在 SQL 中,可以使用 LEFT 函数来实现字符串截取 SELECT LEFT(column_name, length) FROM table_name; 其中,column_name 是要截取的列名,table_name 是表名,length 是要截取的字符数。例如,假设有一个名为 employ…

left函数sql的最佳实践有哪些

在SQL中,LEFT函数用于从左表(主表)返回所有的行,并从右表(子表)返回与左表匹配的行。当没有匹配时,则结果集中右表的所有选择列将填充为NULL。以下是使用LEFT函数的一些最佳实践:明确目的:在使用LEFT函数之前…

left函数sql如何使用

在SQL中,LEFT函数用于从左表中选择所有的行,并从右表中选择匹配的行。如果右表中没有匹配的行,则结果集中将包含NULL值。LEFT函数的语法如下: SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.colu…

lamp兄弟连 linux

“LAMP兄弟连 Linux”这个表述可能有些混淆或不准确。通常我们说的“LAMP”是指 Linux, Apache, MySQL, PHP/Python 的组合,是Web开发中常用的服务器环境。下面我将详细解释 LAMP 的组成、用途以及相关命令和脚本。一…

lampp linux

LAMP 是一个常用的 Web 服务器栈,由 Linux、Apache、MySQL 和 PHP 四个组件组成。如果你是在问如何在 Linux 上安装和配置 LAMP 服务器,我可以为你提供一个常见的安装方法。? 常见的 LAMP 服务器安装方式(基于 Ubu…

Kylin SQL有哪些特点

Apache Kylin是一个开源的分布式分析引擎,它提供了Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力,以支持超大规模数据。以下是Kylin SQL的主要特点:标准SQL接口:Kylin以标准的SQL作为对外服务的接口,支持大…

Kylin SQL性能优化怎么做

Apache Kylin是一个开源的分布式分析引擎,旨在提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力,以支持超大规模数据的快速查询。以下是一些关于Kylin SQL性能优化的方法: Kylin SQL性能优化方法优化数据模型:合…

ksh linux

ksh 是 KornShell 的缩写,是一种广泛使用的 Unix/Linux shell 脚本语言,以其强大的功能和灵活性著称。它在许多 Linux 发行版中仍然被支持,尤其是在旧系统或特定环境中。? 一、ksh 的主要特点兼容性好:支持大多数…

kali linux输入中文

在 Kali Linux 中,输入中文是可行的,但需要使用特定的编码方式(如 UTF-8)来确保正确显示。以下是几种常见的方法:? 方法 1:使用 UTF-8 编码(默认) Kali Linux 默认使用 UTF-8 编码,因此你可以直接输入中文字…

kali linux的安全渗透

在Kali Linux中进行安全渗透测试是一个非常常见的任务,通常用于漏洞扫描、网络入侵模拟、权限提升、漏洞利用等。以下是一些常见的Kali Linux安全渗透测试命令和脚本,帮助你开始:一、常用渗透测试工具 1. Nmap(网络…

kali linux密码破解

在使用 Kali Linux 进行密码破解时,必须严格遵守法律和道德规范,确保仅在合法授权的范围内使用。未经授权的密码破解行为可能构成犯罪,严重违反网络安全法规。 如果你是在进行安全测试或渗透测试,建议在合法授权的…

kali linux安

您提到的“Kali Linux 安装”是 Linux 操作系统中的一种常用工具,主要用于渗透测试和网络安全相关的任务。以下是 Kali Linux 的基本安装和配置方法,适用于大多数 Linux 发行版(如 Debian、Ubuntu、CentOS 等)。一…

kali linux加

您提到的“Kali Linux 加”可能有多种含义,以下是几种常见情况的解释和对应的Linux命令或脚本:1. 安装 Kali Linux(如果尚未安装) Kali Linux 是一个基于 Debian 的 Linux 发行版,主要用于渗透测试和安全审计。如…

kali linux下载

在 Kali Linux 中下载软件包或系统文件,通常可以通过以下几种方式实现:1. 使用 apt(Debian/Ubuntu 基础发行版) Kali Linux 是基于 Debian 的,所以使用 apt 是最常用的方式。 下载软件包(例如:nginx): sudo a…

kali linux 网卡

在 Kali Linux 中,网卡(网络接口)的管理通常通过 ip 或 ifconfig 命令进行。以下是一些常见操作和命令的详细说明:1. 查看当前所有网卡(接口) ip link show 或 ls /sys/class/net/ 这两个命令会列出所有网卡接口…