DATA ACCESS LAYER
在一些不同的示例教程中,我们可能看到 DAL 的实现在主项目中,并且每个控制器中都有实例。我们不建议这么做。
当我们编写 DAL 时,我们应该将其作为一个独立的服务来创建。在 .NET Core 项目中,这一点很重要,因为当我们将 DAL 作为一个独立的服务时,我们就可以将其直接注入到 IOC(控制反转)容器中。IOC 是 .NET Core 内置功能。通过这种方式,我们可以在任何控制器中通过构造函数注入的方式来使用。
public class OwnerController: Controller { private IRepository _repository; public OwnerController(IRepository repository) { _repository = repository; } }
CONTROLLERS
控制器应该始终尽量保持整洁。我们不应该将任何业务逻辑放置于内。
因此,我们的控制器应该通过构造函数注入的方式接收服务实例,并组织 HTTP 的操作方法(GET,POST,PUT,DELETE,PATCH...):
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 请求,验证模型,捕捉异常和返回响应。
[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