这似乎是一个奇怪的问题,但我还没有找到一个“适当的”答案。我尝试过谷歌搜索,但我找不到任何有用的东西(也许我找错了条件)。
我正在参加几个构建Web的课程,一个使用Spring,另一个使用NodeJS (与Express一起使用),我们被告知使用逻辑层,比如“服务层”或“数据层”,但我还没有完全理解哪些职责应该属于谁。
例如,在Spring项目中,我得到一个POST请求,我的处理程序接收一个DTO,然后我需要执行以下步骤:
我很难理解每个步骤属于哪个“逻辑”层(因为我还没有完全理解分层),特别是谁处理错误以及如何处理这些错误。例如,如果由于业务规则而导致验证失败,那么我抛出的异常不应该知道HTTP,但是捕获它并映射到适当的HTTP错误是谁的工作呢?
谢谢你的帮助。
发布于 2020-04-18 15:17:58
数据层处理持久化数据。有时被称为持久性层。因此,这将包括从数据库中读取、将模型保存到数据库,等等。因此,所有的数据库访问都是通过数据层完成的。服务层将使用数据层访问和修改存储在数据库中的数据。
服务层和两个数据层都可以处理验证,但通常在服务层进行验证,因为对于大多数实体/模型来说,验证逻辑对于数据库或文件等不同的持久性方法保持不变。对于复杂的验证,服务层可以在单独的Validator类上调用validate。
如果希望使用特定的状态代码进行响应,可以将@ResponseStatus注释添加到要响应请求的状态代码的异常中,然后让未察觉的异常为框架传播,以将其转换为http响应。
@ResponseStatus(code = HttpStatus.BAD_REQUEST)
public class YourException extends RuntimeException {当抛出本机未处理异常时,您可以让框架处理它们。这将导致状态500响应。
因此,对于您的步骤,我会这样实现它们:
发布于 2020-04-18 14:40:06
通常,您不需要执行任何特定的映射,因为它是由您使用的框架直接执行的。
例如,在HTTP中,您只需指定验证规则,让框架执行其余的操作,即检查输入是否有效,如果没有,则返回适当的ASP.NET响应,并使用适当的MIME类型和适当的HTTP代码。
类似地,如果服务器上出现意外情况,例如您试图保存一个文件,但由于RAID控制器遇到错误并将所有磁盘切换到只读模式,则会出现异常,那么您只需让异常传播到框架,该框架将向调用方返回HTTP 500。
与自己处理异常相比,这有一个额外的好处。您可以轻松地添加行为,如日志记录或自定义错误页。
https://softwareengineering.stackexchange.com/questions/408971
复制相似问题