在使用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
对象类型?
答案 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
参数时会发生什么等。
答案 1 :(得分:9)
第二种方法允许您仅返回状态代码(如示例中的404),流文件内容和其他类型的非对象内容。