【发布时间】:2020-12-30 01:00:26
【问题描述】:
我在尝试使用客户端 SDK 创建新迭代时遇到错误:
值不能为空。 参数名称:节点名
作为测试,我尝试使用 Postman 和 REST API(按照 here 的建议)创建它,并且成功了。
我已经成功地使用了很长一段时间来消除我今年的 sprint 层次结构。这是第一次出现这种错误——过去一年的运行顺利进行。自去年成功运行以来,我没有改变任何东西(据我所知)。
正如我们所见,迭代的Name 属性设置正确。我尝试了Overloads 而不是Shadows,但这没有帮助。
如何解决此问题以了解 nodeName 是什么以及如何使用客户端 SDK 填充它?
这是我的代码:
Module Main()
Private Sub AddYear(Year As Integer, Client As WorkItemTrackingHttpClient)
Dim oIterationYear As Classifications.Iteration
Dim dFinishDate As Date
Dim dStartDate As Date
Console.WriteLine($"Year:{vbTab}{vbTab}{Year}")
dFinishDate = New Date(Year, 12, 31)
dStartDate = New Date(Year, 1, 1)
oIterationYear = New Classifications.Iteration(Client, TeamProject, Year, dStartDate, dFinishDate)
oIterationYear.Save()
...
End Sub
End Module
Public Class Iteration
Inherits Base
Public Sub New(Client As WorkItemTrackingHttpClient, TeamProject As TeamProjects, Name As String, StartDate As Date, FinishDate As Date)
Me.New(Client, TeamProject, Name, StartDate, FinishDate, Nothing)
End Sub
Public Sub New(Client As WorkItemTrackingHttpClient, TeamProject As TeamProjects, Name As String, StartDate As Date, FinishDate As Date, Parent As Iteration)
MyBase.New(Client, TeamProject, Parent)
Me.StructureType = TreeNodeStructureType.Iteration
Me.FinishDate = FinishDate
Me.StartDate = StartDate
Me.Name = Name
End Sub
...
End Class
Public MustInherit Class Base
Inherits WorkItemClassificationNode
Public Sub New(Client As WorkItemTrackingHttpClient, TeamProject As TeamProjects, Parent As Base)
Me.ProjectName = TeamProject.ToDescription
Me.Parent = Parent
Me.Client = Client
End Sub
Public Sub Save()
If Me.Parent.IsNothing Then
Me.Node = Me.Client.CreateOrUpdateClassificationNodeAsync(Me, Me.ProjectName, Me.StructureType).Result <-- Error
Else
Me.Node = Me.Client.CreateOrUpdateClassificationNodeAsync(Me, Me.ProjectName, Me.StructureType, path:=Me.Path).Result
End If
End Sub
...
Public Shadows Property Name As String
Get
If Me.Node.IsNothing Then
Name = Me._Name
Else
Name = Me.Node.Name
End If
End Get
Set(Value As String)
Me._Name = Value
End Set
End Property
Private _Name As String
End Class
注意:这是一个与语言无关的问题,因此我故意省略了VB.NET 标签。答案可以来自 VB.NET 或 C#——我可以用任何一个。
-- 编辑--
根据在接受的答案中找到的设计建议,我想出了这个可行的解决方案:
Public MustInherit Class Base
Public Sub New(Client As WorkItemTrackingHttpClient, TeamProject As TeamProjects, Parent As Base)
Me.Node = New WorkItemClassificationNode With {
.StructureType = StructureType,
.Name = Name
}
Me.ProjectName = TeamProject.ToDescription
Me.Parent = Parent
Me.Client = Client
Me.Name = Name
End Sub
Public Sub Save()
If Me.Parent.IsNothing Then
Me.Node = Me.Client.CreateOrUpdateClassificationNodeAsync(Me.Node, Me.ProjectName, Me.StructureType).Result
Else
Me.Node = Me.Client.CreateOrUpdateClassificationNodeAsync(Me.Node, Me.ProjectName, Me.StructureType, path:=Me.Path).Result
End If
End Sub
...
Public Property Name As String
Get
Return Me.Node.Name
End Get
Private Set(Value As String)
Me.Node.Name = Value
End Set
End Property
End Class
基本上我所做的只是从WorkItemClassificationNode 中删除基类的继承,并在所有情况下在内部存储节点引用。我还简化了Name 属性的实现。
至于为什么它突然停止工作而我的代码没有任何变化,我唯一能想到的是编译器发生变化影响SDK评估Shadows和Overloads的方式的可能性很小关键词。我知道这是一个很长的机会,但否则我会完全不知所措。
底线,它现在可以工作了。
【问题讨论】:
标签: api sdk client azure-devops-server-2019