C# 在Azure API for VM中,是否有一种方法可以用一个方法定义多个现有数据磁盘?

C# 在Azure API for VM中,是否有一种方法可以用一个方法定义多个现有数据磁盘?,c#,azure,fluent,azure-sdk-.net,C#,Azure,Fluent,Azure Sdk .net,我有一段流畅的C代码: 如果我知道存在多少磁盘,语法将是: var tempVM = await azure.VirtualMachines.Define(targetVMName) .WithRegion(vm.Region) .WithExistingResourceGroup(targetResourceGroupName) .WithNewPrimaryNetworkInterface(nicDefinitions[0])

我有一段流畅的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();
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();

所以,回答这个问题,不,流畅的语法没有什么特别的,只是一系列方法调用。当您通过让每个方法返回您可以调用更多方法的内容来链接方法调用时,您不能使它们有条件;您可以创建一个方法,但不执行上面演示的任何操作。当您使用空数组调用它时,不会发生任何事情。

假设这是在名为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();
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();
所以,回答这个问题,不,流畅的语法没有什么特别的,只是一系列方法调用。当您通过让每个方法返回您可以调用更多方法的内容来链接方法调用时,您不能使它们有条件;您可以创建一个方法,但不执行上面演示的任何操作。当您使用空数组调用它时,什么也不会发生。

WithExistingDataDisk在接口中声明

此接口不提供在一次调用中添加多个现有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;
    }
}
WithExistingDataDisk在接口中声明

此接口不提供在一次调用中添加多个现有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;
    }
}

通常在fluent 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();
因为fluentapi的基本设计是每个方法返回它所操作的相同类型


如果你能做到这一点,你还可以定义你自己的扩展方法。使用现有的数据盘或类似的工具。

通常在fluent 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();
因为fluentapi的基本设计是每个方法返回它所操作的相同类型


如果你能做到这一点,你也可以定义你自己的扩展方法。使用现有的数据盘或类似的工具。

这取决于库。您在Azure上使用的库是什么?可能是重新设计,将数据磁盘作为一个单独的实体存在于0到多个数据库中relationship@Robert我还以为是他自己写的呢。我的错误。是否有流畅的语法来支持0个或更多磁盘?-流利的API本身既不是魔术,也不是好的实践。有时他们帮助,有时他们使调试成为一种痛苦。在许多情况下,它们只是返回原始接口的扩展方法。您可以轻松地创建自己的扩展方法,将磁盘的IEnumerable添加到定义中并返回它,具体取决于库。您在Azure上使用的库是什么?可能是重新设计,将数据磁盘作为一个单独的实体存在于0到多个数据库中relationship@Robert我还以为是他自己写的呢。我的错误。是否有流畅的语法来支持0个或更多磁盘?-流利的API本身既不是魔术,也不是好的实践。有时他们帮助,有时他们使调试成为一种痛苦。在许多情况下,它们只是返回原始接口的扩展方法。您可以轻松创建自己的扩展方法,将磁盘的IEnumerable添加到定义中并返回它。您可以使用IEnumerable而不是params IDisk[]并传递ddirectly@PanagiotisKanavos,d不一定是数组,最好的选择是同时使用这两个扩展。您可以使用IEnumerable而不是params IDisk[]然后通过ddirectly@PanagiotisKanavos,d不一定是数组,最好的选择是同时具有两个扩展。是的,但WithTags可能会返回一个无法从WithExistingDataDisk或CreateSync返回的类型分配的类型,因此您可能需要更多中间变量来存储结果,将控制流放在fluent块中有点超出了首先使用fluent语法的目的……是的,但是WithTags可能会返回一个无法从WithExistingDataDisk或CreateAncy返回的类型中分配的类型,因此您可能需要更多的中间变量来存储结果,将控制流放在一个fluent块中,有点超出了将fluent语法放在首位的目的。。。