前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >尝鲜新版 Azure .NET SDK

尝鲜新版 Azure .NET SDK

作者头像
Edi Wang
发布2019-12-16 15:02:48
6500
发布2019-12-16 15:02:48
举报
文章被收录于专栏:汪宇杰博客汪宇杰博客

导语

近日,微软发布了一个新款 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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 汪宇杰博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档