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