在 Azure API for VM 中,有没有办法用一种方法定义许多现有数据磁盘?
In Azure API for VM, is there a way to define many existing data disks with one method?
我有一段流畅的 C# 代码:
如果我知道有多少个磁盘,语法将是:
var tempVM = await azure.VirtualMachines.Define(targetVMName)
.WithRegion(vm.Region)
.WithExistingResourceGroup(targetResourceGroupName)
.WithNewPrimaryNetworkInterface(nicDefinitions[0])
.WithSpecializedOSDisk(disks[0], disks[0].OSType.Value)
.WithSize(vm.Size)
.WithTags(tags)
.WithExistingDataDisk(d[0]) <<<<<<<
.WithExistingDataDisk(d[1]) <<<<<<<
.WithExistingDataDisk(d[2]) <<<<<<<
.WithExistingDataDisk(d[3]) <<<<<<<
.CreateAsync();
我可能有 0 个或更多数据磁盘要添加。是否有支持0或更多磁盘的流畅语法?
假设这是在名为 IWithManagedCreate
的接口上使用扩展方法,你有这个方法:
public static IWithManagedCreate WithExistingDataDisk(this IWithManagedCreate vm, IDisk disk)
{
// ...
return vm;
}
您可以通过 params IDisk[]
重载简单地添加您自己的扩展方法:
public static IWithManagedCreate WithExistingDataDisks(this IWithManagedCreate vm, params IDisk[] disks)
{
foreach (var disk in disks)
{
vm = vm.WithExistingDataDisk(disk);
}
return vm;
}
然后这样称呼它:
.WithTags(tags)
.WithExistingDataDisks(d) // passing the array containing 0 or more disks
.CreateAsync();
所以,要回答这个问题,不,流利的语法没什么特别的,只是一连串的方法调用。当您链接方法调用时(通过让每个方法 return 可以调用更多方法的东西),您不能使它们成为条件;您可以创建一个方法,但如上所示不执行任何操作。当您使用空数组调用它时,什么也不会发生。
WithExistingDataDisk
在IWithManagedDataDisk
接口中声明。
此接口不提供任何方法来在一次调用中添加许多现有 IDisk
。
无论如何,您可以像这样将其实现为扩展方法:
public static class WithManagedDataDiskExtensions
{
// allow to manually specify many disks to add
public static IWithManagedDataDisk WithExistingDataDisks(this IWithManagedDataDisk self, params IDisk[] disks)
{
return self.WithExistingDataDisks((IEnumerable<IDisk>) disks);
}
// allow to add an enumerable of many disks
public static IWithManagedDataDisk WithExistingDataDisks(this IWithManagedDataDisk self, IEnumerable<IDisk> disks)
{
foreach (var disk in disks)
self = self.WithExistingDataDisk(disk);
return self;
}
}
并像这样使用它:
var tempVM = await azure.VirtualMachines.Define(targetVMName)
.WithRegion(vm.Region)
.WithExistingResourceGroup(targetResourceGroupName)
.WithNewPrimaryNetworkInterface(nicDefinitions[0])
.WithSpecializedOSDisk(disks[0], disks[0].OSType.Value)
.WithSize(vm.Size)
.WithTags(tags)
.WithExistingDataDisks(d[0], d[1], d[2], d[3])
//.WithExistingDataDisks(d)
.CreateAsync();
通常在流利的 API 中,您可以在循环中使用赋值,如下所示:
var expTempVM = azure.VirtualMachines.Define(targetVMName)
.WithRegion(vm.Region)
.WithExistingResourceGroup(targetResourceGroupName)
.WithNewPrimaryNetworkInterface(nicDefinitions[0])
.WithSpecializedOSDisk(disks[0], disks[0].OSType.Value)
.WithSize(vm.Size)
.WithTags(tags);
foreach (var d in disks)
{
expTempVM = expTempVM.WithExistingDataDisk(d);
}
var tempVM = await expTempVM.CreateAsync();
作为 fluent API 的基本设计,每个方法 returns 与其操作的类型相同。
如果可以的话,您还可以定义自己的扩展方法,.WithExistingDataDisks
或类似方法。
我有一段流畅的 C# 代码:
如果我知道有多少个磁盘,语法将是:
var tempVM = await azure.VirtualMachines.Define(targetVMName)
.WithRegion(vm.Region)
.WithExistingResourceGroup(targetResourceGroupName)
.WithNewPrimaryNetworkInterface(nicDefinitions[0])
.WithSpecializedOSDisk(disks[0], disks[0].OSType.Value)
.WithSize(vm.Size)
.WithTags(tags)
.WithExistingDataDisk(d[0]) <<<<<<<
.WithExistingDataDisk(d[1]) <<<<<<<
.WithExistingDataDisk(d[2]) <<<<<<<
.WithExistingDataDisk(d[3]) <<<<<<<
.CreateAsync();
我可能有 0 个或更多数据磁盘要添加。是否有支持0或更多磁盘的流畅语法?
假设这是在名为 IWithManagedCreate
的接口上使用扩展方法,你有这个方法:
public static IWithManagedCreate WithExistingDataDisk(this IWithManagedCreate vm, IDisk disk)
{
// ...
return vm;
}
您可以通过 params IDisk[]
重载简单地添加您自己的扩展方法:
public static IWithManagedCreate WithExistingDataDisks(this IWithManagedCreate vm, params IDisk[] disks)
{
foreach (var disk in disks)
{
vm = vm.WithExistingDataDisk(disk);
}
return vm;
}
然后这样称呼它:
.WithTags(tags)
.WithExistingDataDisks(d) // passing the array containing 0 or more disks
.CreateAsync();
所以,要回答这个问题,不,流利的语法没什么特别的,只是一连串的方法调用。当您链接方法调用时(通过让每个方法 return 可以调用更多方法的东西),您不能使它们成为条件;您可以创建一个方法,但如上所示不执行任何操作。当您使用空数组调用它时,什么也不会发生。
WithExistingDataDisk
在IWithManagedDataDisk
接口中声明。
此接口不提供任何方法来在一次调用中添加许多现有 IDisk
。
无论如何,您可以像这样将其实现为扩展方法:
public static class WithManagedDataDiskExtensions
{
// allow to manually specify many disks to add
public static IWithManagedDataDisk WithExistingDataDisks(this IWithManagedDataDisk self, params IDisk[] disks)
{
return self.WithExistingDataDisks((IEnumerable<IDisk>) disks);
}
// allow to add an enumerable of many disks
public static IWithManagedDataDisk WithExistingDataDisks(this IWithManagedDataDisk self, IEnumerable<IDisk> disks)
{
foreach (var disk in disks)
self = self.WithExistingDataDisk(disk);
return self;
}
}
并像这样使用它:
var tempVM = await azure.VirtualMachines.Define(targetVMName)
.WithRegion(vm.Region)
.WithExistingResourceGroup(targetResourceGroupName)
.WithNewPrimaryNetworkInterface(nicDefinitions[0])
.WithSpecializedOSDisk(disks[0], disks[0].OSType.Value)
.WithSize(vm.Size)
.WithTags(tags)
.WithExistingDataDisks(d[0], d[1], d[2], d[3])
//.WithExistingDataDisks(d)
.CreateAsync();
通常在流利的 API 中,您可以在循环中使用赋值,如下所示:
var expTempVM = azure.VirtualMachines.Define(targetVMName)
.WithRegion(vm.Region)
.WithExistingResourceGroup(targetResourceGroupName)
.WithNewPrimaryNetworkInterface(nicDefinitions[0])
.WithSpecializedOSDisk(disks[0], disks[0].OSType.Value)
.WithSize(vm.Size)
.WithTags(tags);
foreach (var d in disks)
{
expTempVM = expTempVM.WithExistingDataDisk(d);
}
var tempVM = await expTempVM.CreateAsync();
作为 fluent API 的基本设计,每个方法 returns 与其操作的类型相同。
如果可以的话,您还可以定义自己的扩展方法,.WithExistingDataDisks
或类似方法。