转载:ASP.NET Core Web API 控制器与方法返回输出
DATA ACCESS LAYER
在一些不同的示例教程中,我们可能看到 DAL 的实现在主项目中,并且每个控制器中都有实例。我们不建议这么做。
当我们编写 DAL 时,我们应该将其作为一个独立的服务来创建。在 .NET Core 项目中,这一点很重要,因为当我们将 DAL 作为一个独立的服务时,我们就可以将其直接注入到 IOC(控制反转)容器中。IOC 是 .NET Core 内置功能。通过这种方式,我们可以在任何控制器中通过构造函数注入的方式来使用。
1
2
3
4
5
6
7
8
|
public class OwnerController: Controller { private IRepository _repository; public OwnerController(IRepository repository) { _repository = repository; } } |
CONTROLLERS
控制器应该始终尽量保持整洁。我们不应该将任何业务逻辑放置于内。
因此,我们的控制器应该通过构造函数注入的方式接收服务实例,并组织 HTTP 的操作方法(GET,POST,PUT,DELETE,PATCH...):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
public class OwnerController : Controller { private readonly ILoggerManager _logger; private readonly IRepository _repository; public OwnerController(ILoggerManager logger, IRepository repository) { _logger = logger; _repository = repository; } [HttpGet] public IActionResult GetAllOwners() { } [HttpGet( "{id}" , Name = "OwnerById" )] public IActionResult GetOwnerById(Guid id) { } [HttpGet( "{id}/account" )] public IActionResult GetOwnerWithDetails(Guid id) { } [HttpPost] public IActionResult CreateOwner([FromBody]Owner owner) { } [HttpPut( "{id}" )] public IActionResult UpdateOwner(Guid id, [FromBody]Owner owner) { } [HttpDelete( "{id}" )] public IActionResult DeleteOwner(Guid id) { } } |
我们的 Action 应该尽量保持简洁,它们的职责应该包括处理 HTTP 请求,验证模型,捕捉异常和返回响应。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
[HttpPost] public IActionResult CreateOwner([FromBody]Owner owner) { try { if (owner.IsObjectNull()) { return BadRequest( "Owner object is null" ); } if (!ModelState.IsValid) { return BadRequest( "Invalid model object" ); } _repository.Owner.CreateOwner(owner); return CreatedAtRoute( "OwnerById" , new { id = owner.Id }, owner); } catch (Exception ex) { _logger.LogError($ "Something went wrong inside the CreateOwner action: { ex} " ); return StatusCode(500, "Internal server error" ); } } |
在大多数情况下,我们的 action 应该将 IActonResult
作为返回类型(有时我们希望返回一个特定类型或者是 JsonResult
...)。通过使用这种方式,我们可以很好地使用 .NET Core 中内置方法的返回值和状态码。
使用最多的方法是:
-
OK => returns the 200 status code
-
NotFound => returns the 404 status code
-
BadRequest => returns the 400 status code
-
NoContent => returns the 204 status code
-
Created, CreatedAtRoute, CreatedAtAction => returns the 201 status code
-
Unauthorized => returns the 401 status code
-
Forbid => returns the 403 status code
-
StatusCode => returns the status code we provide as input