何时返回IHttpActionResult vs Object

在使用ASP.NET Web API的示例中,我看到两种不同的方法用于将数据返回到调用jQuery函数。 第一种方法返回Client类型的对象,但我不确定第二种方法返回的是什么。

方法#1 (返回Client对象)

 public IEnumerable 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可以很好地分离关注点

您的控制器可以专注于以最明智的方式响应请求(状态代码,错误消息等)。 另一个(服务)层可以专注于实际检索和转换业务数据。

副作用是,您的控制器方法变得更加可unit testing 。 请考虑以下简单示例:

 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(actionResult); } } 

类似地,您可以模拟服务层并测试当您向控制器提供已知的id参数时会发生什么。

这是一篇关于Web Api中unit testing控制器的好文章

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