在用于VM的Azure API中,是否有一种方法可以用一种方法定义许多现有数据磁盘?

我有一段流畅的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个或更多磁盘?

guozili1983 回答:在用于VM的Azure API中,是否有一种方法可以用一种方法定义许多现有数据磁盘?

假设此方法在名为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();

因此,要回答这个问题,不,流畅的语法没什么特别的,只是一连串的方法调用。当您链接方法调用时(通过让每个方法返回可以调用更多方法的东西),您不能将它们设置为有条件的。您可以制作一个方法,但是如上所述却什么也不做。当您使用空数组调用它时,什么也没发生。

,

WithExistingDataDiskIWithManagedDataDisk接口中声明。

此接口不提供任何在一个调用中添加许多现有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();

流利的API的基本设计是,每种方法都返回与其操作相同的类型。

如果可以的话,还可以定义自己的扩展方法.WithExistingDataDisks或类似的方法。

本文链接:https://www.f2er.com/2838816.html

大家都在问