处理ApiControllers结果的好模式是什么?

时间:2016-09-13 13:49:56

标签: vb.net asp.net-web-api asp.net-apicontroller

我有一个ApiController。

 <HttpGet>
        Public Function Find(ByVal planId As Integer) As IHttpActionResult
            Dim results As IHttpActionResult

            Try
                Dim model As PlanModel = plansDAL.GetPlan(planId)
                If model IsNot Nothing Then
                    results = BadRequest(String.Format("Plan {0} was not found.", planId))
                Else
                    results = Ok(model)
                End If

            Catch ex As Exception
                results = BadRequest(String.Format("Plan {0} was not found.", planId))
            End Try

            Return results
        End Function

我更喜欢没有这样的嵌套语句。

我想知道在控制器操作失败/重定向/完成插入时返回正确结果的更好模式。因此控制器可以返回200 ok和content,或者它可能返回404 not found。

我知道要尝试的东西,但我宁愿使用一些既定的模式。我的想法是添加一个Response类型的私有成员。然后我可以在我的控制器中更新该对象并返回一次,最后只返回一次。

但是,我不知道如何做到这一点,我不会给开发人员带来负担,每次都能正确制作回复。

1 个答案:

答案 0 :(得分:0)

我认为这个article on mvc4 提供了我正在寻找的模式。 它似乎简化了方法,并提供了一种机制,可以用明确的期望来进行单元测试。它还确保未处理的异常被冒泡并返回YSOD,直到它们被处理为止。可能,它们可以在全局错误模块中处理。

  

下面的所有代码都是在没有IDE的情况下编写的,可能存在语法错误

 <HttpGet>
        Public Function Find(ByVal planId As Integer) As IHttpActionResult    
               Dim model As PlanModel = plansDAL.GetPlan(planId)

               If model is Nothing Then
                 throw new HttpResponseException(HttpStatusCode.NotFound)
               End If

            Return Ok(model)
        End Function

现在,为了额外的奖励。因为我正在回答我自己的问题。如果我知道想要编写单元测试,那么它们就非常直接了。

<TestMethod>
public sub Should_Return_Ok_When_Plan_Is_Found()

dim mockedService as new Mock(Of plansDAL)
dim mockPlan as new PlanModel 'set this up however to be the expected values.
dim controller as new PlanController()

mockedService.setup(sub(s) s.GetPlan(it.isAny(Of Integer))).returns(mockPlan)
dim result as IHttpActionResult = controller.find(1)


Assert.areEqual(mockPlan,result.contents)

end sub