Appearance
RFC 9457 Errors Sample
FluentValidation、ErrorOr、Endpoint FilterをRFC 9457 Problem Detailsへ接続するcompile可能な.NET 10 Minimal API例。
このsampleは既知のvalidation/application error経路に焦点を当てる。feature固有の処理をFeatures、横断的なProblem Details生成とvalidationをSharedへ配置する。
text
Features/Widgets/
├── WidgetEndpoints.cs
├── WidgetErrors.cs
└── Create/
├── WidgetCreateEndpoint.cs
├── WidgetCreateHandler.cs
├── WidgetCreateCommand.cs
├── WidgetCreateResult.cs
├── WidgetCreateRequest.cs
├── WidgetCreateRequestValidator.cs
└── WidgetCreateResponse.cs
Infrastructure/
└── WidgetServiceCollectionExtensions.cs
Shared/
├── Api/
│ ├── ApiProblemResults.cs
│ └── ProblemTypeOptions.cs
└── Validation/
├── FailFastValidator.cs
└── RequestValidationFilter.csDemonstrates
FailFastValidator<T>がrule chain内とvalidator全体を停止し、宣言順の最初のfailureだけを返す。RequestValidationFilter<TRequest>がendpoint実行前に検証し、失敗をProblemHttpResultへ変換する。ApiProblemResultsが絶対type URI、HTTP statusと一致するstatus、安定したtitle、安全なdetail、単数codeを生成する。- Endpointがvalidated Request DTOをCommandへ変換し、HandlerはHTTP型を扱わず
ErrorOr<WidgetCreateResult>を返す。業務エラーはWidgetErrorsへ集約し、EndpointはResultをResponse DTOへ変換して先頭errorだけをProblem Detailsへmappingする。 Program.csはapp.MapWidgetApi()だけを呼び、Area route groupはWidgetEndpoints、use case固有のroute mappingとfilter登録はWidgetCreateEndpoint.MapCreateApiへ閉じ込める。
このsampleはFluentValidationとErrorOrから返す既知のAPI errorを対象にする。malformed JSON、model binding failure、想定外例外を含むAPI全体のerror pipelineは../../references/validation.mdの規則に従って別途構成する。 NameとQuantityの規則はこのsampleではHTTP request制約であり、domain invariantやpersistence contractを表さない。
Build
bash
dotnet build Rfc9457Errors.Sample.csprojResponse example
NameとQuantityが両方不正でも、宣言順で最初のName failureだけを返す。
json
{
"type": "https://example.com/problems/invalid-request",
"title": "Invalid request",
"status": 400,
"detail": "Name is required.",
"code": "widget.name_required"
}response media typeはapplication/problem+json。errors配列とfield pointerは返さない。