专栏首页汪宇杰博客尝鲜新版 Azure .NET SDK

尝鲜新版 Azure .NET SDK

导语

近日,微软发布了一个新款 Azure .NET SDK,这并不是一个简单的版本升级,而是一个编程体验上的巨大改变。所以,程序员又双叒叕得学习了!是不是感觉以前的积累又双叒叕被微软玩弄了?虽然适应新版 SDK 可能需要一个996的过程,但新版的 Azure .NET SDK 更强大,更灵活,使用更简单,学会了就能比以前少一些 996,我们来看看吧!

Azure SDK 现状

目前,.NET 操作 Azure 的官方包比较混乱,对新手很不友好,如果您刚接触 Azure 可能会懵逼,我给大家总结一下现在的情况:

Azure 的 .NET SDK 官方包目前有这么几种:

1. 上古时代 WindowsAzure.*

在微软云开天辟地之时,纳德拉还没有当上CEO,那个时微软团结在以 Windows 为核心的鲍尔默同志周围,因此微软云最早的名字叫做 Windows Azure,也就有了第一批的 .NET SDK。这套 SDK 早已在一年前停更,并被后者取代,请不要使用这个前缀的 NuGet 包对接 Azure

2. 现役部队 Microsoft.Azure.*

微软为了体现予力众生,包容一切的指导思想,去除了 Windows 中心化(并抛弃了我心爱的 Windows Phone),改名为 Microsoft Azure 以后,Azure 的 SDK 也随之更名,包的功能更加细分,并取代了之前的 WindowsAzure 包。这也是目前使用最广泛的一套 Azure .NET SDK。我的博客对接 Azure 目前用的也是这套 SDK。它的服务覆盖率最完善,参考资料成熟,可以用来开发当下的应用。

3. 未来之光 Azure.*

虽然现役部队已经很牛逼了,但总有些缺点。比如 API 设计还是不够简洁,完成一个简单操作需要多个步骤,如果说 Microsoft.Azure.* 是半自动步枪的话,那么 Azure.* 的使用体验就是全自动步枪!

例:旧版 SDK 使用体验

AzureServiceTokenProvider tokenProvider = new AzureServiceTokenProvider();

string token = tokenProvider.GetAccessTokenAsync("https://storage.azure.com/").GetAwaiter().GetResult();

TokenCredential tokenCredential = new TokenCredential(token);

StorageCredentials storageCredentials = new StorageCredentials(tokenCredential);

CloudBlobClient blobClient = new CloudBlobClient(new Uri(Configuration["BlobServiceUri"]), storageCredentials);

services.AddSingleton(blobClient);

而新版只要一句话

services.AddAzureClients(builder => builder.AddBlobServiceClient(new Uri(Configuration["BlobServiceUri"])));

另外,新款 SDK 是 Azure Client SDK 的官方 .NET 实现,为啥要提.NET呢?因为 Azure SDK 其实一直是支持多种语言,多个平台的,然而旧版 Azure SDK 的问题在于,Azure 的功能并不全有一一对照的语言实现,比如某功能在 .NET SDK 里有,但在 Python 里可能就没有,而这次微软发布的新版 SDK 会统一全语言的功能实现。这样做也有一个显著的好处,一个正常企业的系统通常不会只用一种语言实现,统一 SDK API 设计以后,切换语言的996成本会降低许多!

最后,旧版 SDK 也有一些依赖项问题,例如某组件依赖 10.0 的 Json.NET,而另一个组件依赖 12.0 版本,管理这些不同的依赖容易 996,这次,微软将统一解决!

但是目前,Azure.* 的包覆盖的 Azure 服务还不全,万一你需要的功能没有的话,就会996,所以建议大家使用之前先看一下自己要对接的 Azure 功能是否已经被支持。

新款 SDK 开源传送门:

https://github.com/Azure/azure-sdk-for-net

迁移案例

这两天我将之前写的一个简易的 Azure Blob 同步工具迁移到了新款 SDK 上。由于工具比较简单,迁移过程并不十分996。

替换 NuGet 包

将 Microsoft.Azure.Storage.Blob、Microsoft.Azure.KeyVault.Core 替换为 Azure.Storage.Blobs

<PackageReference Include="Azure.Storage.Blobs" Version="12.0.0" />

修改代码

定义 Blob Container 的老代码

public static CloudBlobContainer BlobContainer { get; set; }

private static CloudBlobContainer GetBlobContainer()

{

CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials(Options.AccountName, Options.AccountKey), true);

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

CloudBlobContainer container = blobClient.GetContainerReference(Options.ContainerName);

return container;

}

修改为

public static BlobContainerClient BlobContainer { get; set; }

private static BlobContainerClient GetBlobContainer()

{

var container = new BlobContainerClient(Options.ConnectionString, Options.ContainerName);

return container;

}

遍历文件的老代码:

var blobs = await BlobContainer.ListBlobsSegmentedAsync(null);

var cloudFiles = (from item in blobs.Results

where item.GetType() == typeof(CloudBlockBlob)

select (CloudBlockBlob)item

into blob

select new FileSyncInfo()

{

FileName = blob.Name,

Length = blob.Properties.Length

}).ToList();

修改为

var cloudFiles = new List<FileSyncInfo>();

await foreach (var blobItem in BlobContainer.GetBlobsAsync())

{

var fsi = new FileSyncInfo

{

FileName = blobItem.Name,

Length = blobItem.Properties.ContentLength

};

cloudFiles.Add(fsi);

}

可以看到,新版SDK的编程思路和旧版没有太大区别,但使用方法更加简单。由于篇幅关系,其余修改不一一列举了,大家可以参考我 GitHub 的签入历史。

参见: https://github.com/EdiWang/Azure-Blob-Backup/commit/48222f740d6752ba00eee992625a69226b15c836

参考资料

微软官方电视台 Channel 9 对新版 Azure .NET SDK 的介绍:

https://channel9.msdn.com/Shows/On-NET/Exploring-the-new-Azure-NET-SDKs-for-NET

官方样例代码:

https://github.com/Azure/azure-sdk-for-net-samples

Azure SDK 的 C# 编程规范:

https://azure.github.io/azure-sdk/dotnet_introduction.html

本文分享自微信公众号 - 汪宇杰博客(ediwangblog),作者:汪宇杰

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Azure 命令行工具大混战,都是什么,该选哪个?

    最近在学习 Azure 的命令行玩法,发现官方有不止一种命令行工具,容易对新手产生混淆,本文将介绍各种工具都是干啥的,以及如何选择。

    Edi Wang
  • 如何在 Visual Studio 2019 中连接中国版 Azure

    做国内项目很可能用到中国版的 Azure,即世纪互联运营的 azure.cn。然而 Visual Studio 2019 默认连接的是国际版的 Azure,如何...

    Edi Wang
  • Azure 国际版与中国版服务列表对(2020年6月版)

    对于选择Azure平台的用户来说,会面临选择国内还是国际版的问题。由于一些原因,由世纪互联运营的中国大陆版Azure无法落地所有的国际版服务。相比几年前,情况已...

    Edi Wang
  • 采用混合云策略时机已到的几大征兆

    云的吸引力正在不断增加,但公有云提出了安全性方面的担忧。了解为什么混合云策略可以为业务发展带来更多的好处。 如果你和大部分的数据存储专业人士一样,你很可能面对的...

    静一
  • HIDL学习笔记之HIDL C++(第二天)

    HIDL 的远程过程调用 (RPC) 基础架构使用 Binder 机制,这意味着调用涉及开销、需要内核操作,并且可以触发调度程序操作。

    李小白是一只喵
  • SQLServer 存储过程

    exec sp_renamedb ‘Northwind’,’Northwind1’

    授客
  • python---爬取英雄联盟皮肤图片

    爬LOL的皮肤高清图片的大致步骤就是用selenium去爬取英雄联盟所以英雄的皮肤的url地址,然后在用requests库去将图片下载到本地。

    sjw1998
  • 私有存储云如何构建?

    构建内部的云存储必须考虑到弹性、选择正确的平台、支持工作流,以及批量部署和跟公有云的集成。 随着时间的推移,存储即服务的交付进展惊人。如今,公有云,如Amazo...

    静一
  • 完美!Kubernetes 集群的零停机服务器更新

    来源 | https://vflong.github.io/sre/k8s/2020/02/16/zero-downtime-server-updates-fo...

    java进阶架构师
  • RethinkDB的简单介绍

    RethinkDB最早是作为一个对SSD进行专门优化的MySQL存储引擎出现的,其特点在于对SSD的充分利用。而目前RethinkDB已经脱离MySQL成为一个...

    Debian社区

扫码关注云+社区

领取腾讯云代金券