[英]When to return IHttpActionResult vs Object
在使用ASP.NET Web API的示例中,我看到了两种用于将数据返回到调用jQuery函数的不同方法。 第一种方法返回Client
类型的对象,但是我不确定第二种方法返回什么。
方法1 (返回Client
对象)
public IEnumerable<Client> GetAllClients()
{
using (var context = new PQRSModel.PQRSEntities())
{
context.Configuration.ProxyCreationEnabled = false;
var query = context.Clients.OrderBy(c = c.OrgName);
var customers = query.ToList();
return customers;
}
}
方法2 ( IHttpActionResult
什么好处?)
public IHttpActionResult GetClient(int clientId)
{
using (var context = new PQRSModel.PQRSEntities())
{
context.Configuration.ProxyCreationEnabled = false;
var client = context.Clients.FirstOrDefault(c = c.ID == clientId);
if (client == null)
{
return NotFound();
}
return Ok(client);
}
}
如果第二种方法找到单个对象,是否由于某种原因无法返回Client
对象类型?
返回IHttpActionResult
提供了很好的关注点分离 。
您的控制器可以专注于以最明智的方式响应请求(状态代码,错误消息等)。 另一个(服务)层可以专注于实际检索和转换业务数据。
副作用是,您的控制器方法变得可以进行单元测试 。 考虑以下简单示例:
public class MyController : ApiController
{
//or better yet, dependency-inject this
SomeService _service = new SomeService();
public IHttpActionResult Get(int id)
{
if (id < 0)
return BadRequest("Some error message");
var data = _service.GetData(id);
if (data == null)
return NotFound();
return Ok(data);
}
}
不仅通过阅读该方法的逻辑就可以理解它 ,而且您现在可以更轻松自然地测试该逻辑,例如(使用NUnit语法):
[TestFixture]
public class MyControllerTests
{
[Test]
public void Get_WithIdLessThan0_ReturnsBadRequest()
{
var controller = new MyController();
int id = -1;
IHttpActionResult actionResult = controller.Get(id);
Assert.IsInstanceOf<BadRequestErrorMessageResult>(actionResult);
}
}
同样,您可以模拟服务层并测试在将已知id
参数提供给控制器等时发生的情况。
这是一篇有关Web Api中的单元测试控制器的好文章
第二种方法允许您仅返回状态码(如示例中的404),流文件内容和其他类型的非对象内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.