繁体   English   中英

什么时候返回IHttpActionResult vs Object

[英]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;
     }
}

方法2IHttpActionResult什么好处?)

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM