何时返回IHttpActionResult vs Object

时间:2014-05-30 18:22:45

标签: c# asp.net-web-api

在使用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对象类型?

2 个答案:

答案 0 :(得分:18)

返回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参数时会发生什么等。

这是关于Unit Testing Controllers in Web Api

的好文章

答案 1 :(得分:9)

第二种方法允许您仅返回状态代码(如示例中的404),流文件内容和其他类型的非对象内容。