나는 다음과 같은 구조의 asp.net 코어 웹 API를 가지고 :.net Core Web API에서 데이터 유효성 검사를 구조화하는 방법은 무엇입니까?
모두가이 구조를 따라 엔드 포인트의 시리즈가 있습니다View Layer: API endpoints
|
V
Controller Layer: Controller classes implementing endpoints
|
V
Business Logic Layer: Services
|
V
Data Access Layer: Proxy classes to our backend
. 대부분의 API는 순수하게 백엔드에 대한 데이터 쿼리이지만 일부 API는 호출 클라이언트가 데이터를 제출하도록 허용합니다.
나는이 제출 된 데이터에서 발생해야하는 다양한 유효성 검사를 통합하는 깨끗한 방법을 찾고 있습니다.
본래의 의도는 컨트롤러 레이어가 매우 단순하고 실제 "작업"(유효성 검사 포함)을 서비스 레이어로 넘겨 주었고 컨트롤러 레이어는 적절한 HTTP 응답 만 전송해야한다는 것이 었습니다. 내 문제는 서비스가 모든 실제 작업을 수행하고, 컨트롤러에게 반환 할 내용을 가장 잘 전달하는 방법입니다.
데이터 주석을 사용하여 기본 유효성 검사 일부를 캡처 할 수 있으며 대부분의 경우 실제로 데이터 유효성 검사 측면에서 충분할 수 있습니다. 그러나 그것은 등/쓰기 읽기 서비스/데이터 액세스 레이어 WRT에서 더 복잡한 검증, 또는 실패와 같은 다른 문제에는 적용되지 않습니다
내가 이상 심사숙고 한 몇 가지 아이디어 :
가 확인 서비스 계층은 IActionResult 인터페이스를 인식하여 호출 클라이언트로 반환 할 대상을 결정해야합니다. 그런 다음 컨트롤러와 서비스 레이어를 혼합하지만 컨트롤러 레이어를 매우 가늘게 만듭니다.
컨트롤러 계층에서 해석 할 오류 메시지, 예외, 오류 코드 등을 캡슐화하는 다양한 서비스 호출에 대한 다양한 "OperationResults"개체를 만들어 클라이언트로 다시 보낼 HTTP 응답을 결정합니다. 서비스 계층은 http 코드와 전혀 섞이지 않지만 컨트롤러 클래스를 큰 스위치 세트로 전환하여 되돌릴 대상을 결정하기 때문에 이는 분리 된 분리입니다.
컨트롤러 대 서비스 수준에서 캡처하는 것이 이치에 맞춰 유효성 검사를 나눕니다. 예를 들어, null 객체를 저장하기 위해 전달 된 컨트롤러는이를 거부하고 BadRequest()를 반환해야하지만, 서비스 레이어가이를 확인하기를 원하는 자체 이유가있을 때 체크를 추가하는 것은 무리가 있습니다.
나는 틀림없이 일반적으로 .NET 웹 API와 .NET 코어에 다소 새로운 해요, 그래서 활용하고 있지 않다 가능한 몇 가지 명백한 기능이 있다면, 나는 알고 싶네요.
감사의 말을 들어주세요.
예외는 모델에 따라 잘못된 것이 발견되는 즉시 제기해야합니다. 컨트롤러에 걸리면 비즈니스 모델에 맡기지 말아야합니다. 일부 기능이 필요하지만 중복되는 경우 상속을 위해 벨을 울립니다. – Xaqron
짧은 답변은 컨트롤러 동작에 넣습니다. 아키텍처에 상관없이 컨트롤러는 첫 번째 방어선입니다. 서비스 계층은 형식 유효성 검사를해서는 안됩니다. 실제로 서비스 계층은 IActionResult가 무엇인지 알지 못합니다. [FluentValidation] (https://github.com/JeremySkinner/FluentValidation)을 확인하십시오. 성숙하고 안정적이며 널리 사용되는 검증 라이브러리입니다. 질문의 범위를 조금 좁히면 몇 가지 예를 들려 주어 기쁘 겠지만 현재는 조금 더 광범위합니다. – trevorc