在 Web API 控制器方法中返回动态或获取对象类型是正常做法,还是应该使用自定义合约类型并在请求和一般“完整代码”中进行验证?
例如这里是代码片段:
public dynamic CreateOrUpdate([FromBody]object body)
{
return _blService.CreateOrder(body);
}
CreateOrder 执行反序列化并保存并返回Id或错误。
以下是返回动态数据的其他方法。 blService 为对象列表或单个对象返回不同的匿名类型:
public dynamic GetOrdersByTypeId([FromQuery]Guid typeId, [FromQuery]int? pageIndex)
{
return _blService.GetOrdersByTypeId(typeId, pageIndex);
}
public dynamic GetOrderById([FromQuery]Guid id)
{
return _blService.GetOrderById(id);
}
虽然返回
dynamic
有效,但普遍的共识似乎是您应该返回 IHttpActionResult
,这使您能够使用许多预定义的方法(例如 Ok()
、InternalServerError()
、BadRequest()
、NotFound()
)
、Redirect()
,除其他外,在返回之前正确设置请求的 HTTP 状态代码。
另外,我会写一些 POCO 并将其返回,但这取决于偏好问题。您需要将它们粘贴到一个单独的项目中,但它的优点是您在添加属性时不必更新实际的反序列化代码。
我也不太喜欢这个
[FromBody]object body
,因为使用定义明确的类型会给你带来验证,否则你将不得不自己实现。使用您在 DataAnnotations
命名空间中找到的属性来装饰所述类型会更好。