2017-04-11 2 views
9

나는 다음과 같은 구조의 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 코어에 다소 새로운 해요, 그래서 활용하고 있지 않다 가능한 몇 가지 명백한 기능이 있다면, 나는 알고 싶네요.

감사의 말을 들어주세요.

+0

예외는 모델에 따라 잘못된 것이 발견되는 즉시 제기해야합니다. 컨트롤러에 걸리면 비즈니스 모델에 맡기지 말아야합니다. 일부 기능이 필요하지만 중복되는 경우 상속을 위해 벨을 울립니다. – Xaqron

+3

짧은 답변은 컨트롤러 동작에 넣습니다. 아키텍처에 상관없이 컨트롤러는 첫 번째 방어선입니다. 서비스 계층은 형식 유효성 검사를해서는 안됩니다. 실제로 서비스 계층은 IActionResult가 무엇인지 알지 못합니다. [FluentValidation] (https://github.com/JeremySkinner/FluentValidation)을 확인하십시오. 성숙하고 안정적이며 널리 사용되는 검증 라이브러리입니다. 질문의 범위를 조금 좁히면 몇 가지 예를 들려 주어 기쁘 겠지만 현재는 조금 더 광범위합니다. – trevorc

답변

5

주요 아이디어는 정확합니다. 코드에서 정상 흐름과 오류 흐름을 구분해야합니다. 주요 접근법 중 하나는 .NET 예외를 사용하여 정상적인 플로우가 불가능 함을 나타내는 것입니다.

  • 입력 유효성 확인을 위해 ActionFilter을 사용하십시오. 모든 컨트롤러에 대해 전역 필터를 사용하거나 특정 작업별로 특정 필터를 정의 할 수 있습니다. 문서의 Filters 섹션을 참조하십시오.

  • 컨트롤러 동작을 실행하는 동안 가능한 한 빨리 예외를 발생시키고 이후 실행을 중지해야합니다.그리고 예, 예외 (서비스/비즈니스 계층, DA 계층 등) 중 하나에서 예외가 발생할 수 있습니다.

발생 된 예외를 처리하는 방법은 무엇입니까?

ExceptionHandler 또는 Exception Filters와 같은 ASP.NET Core 오류 처리 방법을 사용하면 예외를 분석하고 그에 따라 적절한/다른 응답을 생성 할 수 있습니다. 관련 항목 참조 SO Error handling in ASP.NET Core 1.0 Web API (Sending ex.Message to the client) 예를 들어. 문서에 error-handling section도 있습니다.

+0

지역화 된 오류 메시지가 필요한 경우 어떻게해야합니까? 특정 유형의 예외에 대해 특정 예외를 작성해야합니까? –

관련 문제