Carter는 ASP.NET Core에 대한 확장 방법 및 기능의 얇은 계층인 프레임워크로, 코드를 더욱 명확하고 가장 중요하게는 더 즐겁게 만들 수 있습니다.
더 나은 이해를 위해 이 저장소 내부의 샘플을 잘 살펴보세요. 샘플은 아래와 같이 일반적인 ASP.NET Core 유형에 대한 우아한 확장의 사용법을 보여줍니다.
기타 확장에는 다음이 포함됩니다.
Validate<T> / ValidateAsync<T>
- ASP.NET Core Minimal API에서는 사용할 수 없는 들어오는 HTTP 요청의 유효성을 검사하는 FluentValidation 확장입니다.BindFile/BindFiles/BindFileAndSave/BindFilesAndSave
- 업로드된 파일에 쉽게 액세스할 수 있습니다. 또는 BindFilesAndSave
호출하면 지정한 경로에 저장됩니다.app.UseExceptionHandler("/errorhandler");
.IResponseNegotiator
를 사용하면 특정 Accept 헤더(콘텐츠 협상)에서 응답이 어떻게 표시되어야 하는지 정의할 수 있습니다. JSON 처리는 기본 응답에 내장되어 있지만 인터페이스를 구현하면 사용자가 리소스를 표시하는 방법을 선택할 수 있습니다. Carter는 IEndpointRouteBuilder
라우팅과 IEndpointConventionBuilder
제공하는 모든 확장(최소 API라고도 함)을 사용합니다. 예를 들어 다음과 같이 인증이 필요한 경로를 정의할 수 있습니다.
app . MapGet ( " / " , ( ) => " There's no place like 127.0.0.1 " ) . RequireAuthorization ( ) ;
저는 수년 동안 최고의 .NET 웹 프레임워크인 Nancy의 열렬한 팬이자 핵심 기여자였으며 "Nancy"라는 이름은 Ruby 웹 프레임워크인 Sinatra에서 영감을 받아 붙여진 것입니다. Frank Sinatra에게는 Nancy라는 딸이 있었고 그것이 바로 여기서 유래되었습니다.
나는 또한 파생된 이름을 생각하려고 노력하고 있었고 최근 Jay-Z가 자신이 새로운 Sinatra라고 선언하는 Empire State of Mind라는 노래를 들었습니다. 그의 진짜 이름은 Shaun Carter이므로 Carter를 데려왔고 여기 있습니다!
마스터 브랜치에서 최신 빌드를 시도하려면 NuGet.config에 https://f.feedz.io/carter/carter/nuget/index.json
추가하고 Carter의 가장 뛰어난 최신 버전을 선택하세요.
템플릿을 사용하거나 새 애플리케이션이나 기존 애플리케이션에 패키지를 수동으로 추가하여 시작할 수 있습니다.
https://www.nuget.org/packages/CarterTemplate/
템플릿 설치 - dotnet new install CarterTemplate
템플릿을 사용하여 새 애플리케이션 만들기 - dotnet new carter -n MyCarterApp -o MyCarterApp
응용 프로그램 cd MyCarterApp
용으로 생성된 새 디렉터리로 이동합니다.
애플리케이션 실행 - dotnet run
https://www.nuget.org/packages/Carter
새로운 빈 ASP.NET Core 애플리케이션 만들기 - dotnet new web -n MyCarterApp
새 프로젝트 위치로 변경 - cd ./MyCarterApp
카터 패키지 추가 - dotnet add package carter
Carter를 사용하도록 Program.cs를 수정하세요.
var builder = WebApplication . CreateBuilder ( args ) ;
builder . Services . AddCarter ( ) ;
var app = builder . Build ( ) ;
app . MapCarter ( ) ;
app . Run ( ) ;
public class HomeModule : ICarterModule
{
public void AddRoutes ( IEndpointRouteBuilder app )
{
app . MapGet ( " / " , ( ) => " Hello from Carter! " ) ;
}
}
dotnet run
var builder = WebApplication . CreateBuilder ( args ) ;
builder . Services . AddSingleton < IActorProvider , ActorProvider > ( ) ;
builder . Services . AddCarter ( ) ;
var app = builder . Build ( ) ;
app . MapCarter ( ) ;
app . Run ( ) ;
public class HomeModule : ICarterModule
{
public void AddRoutes ( IEndpointRouteBuilder app )
{
app . MapGet ( " / " , ( ) => " Hello from Carter! " ) ;
app . MapGet ( " /qs " , ( HttpRequest req ) =>
{
var ids = req . Query . AsMultiple < int > ( " ids " ) ;
return $" It's { string . Join ( " , " , ids ) } " ;
} ) ;
app . MapGet ( " /conneg " , ( HttpResponse res ) => res . Negotiate ( new { Name = " Dave " } ) ) ;
app . MapPost ( " /validation " , HandlePost ) ;
}
private IResult HandlePost ( HttpContext ctx , Person person , IDatabase database )
{
var result = ctx . Request . Validate ( person ) ;
if ( ! result . IsValid )
{
return Results . UnprocessableEntity ( result . GetFormattedErrors ( ) ) ;
}
var id = database . StorePerson ( person ) ;
ctx . Response . Headers . Location = $" / { id } " ;
return Results . StatusCode ( 201 ) ;
}
}
public record Person ( string Name ) ;
public interface IDatabase
{
int StorePerson ( Person person ) ;
}
public class Database : IDatabase
{
public int StorePerson ( Person person )
{
//db stuff
}
}
더 많은 샘플
앞서 언급했듯이 Carter는 앱의 구현을 검색하고 이를 DI에 등록합니다. 그러나 보다 통제된 앱을 원하는 경우 Carter에는 모듈, 유효성 검사기 및 응답 협상기를 수동으로 등록할 수 있는 CarterConfigurator
함께 제공됩니다.
Carter는 System.Text.Json
기반의 응답 협상자를 사용하지만 IResponseNegotiator
인터페이스를 통해 사용자 정의 구현을 제공합니다. IResponseNegotiator
의 자체 구현(예: CustomResponseNegotiator
)을 사용하려면 초기 Carter 구성에 다음 줄을 추가합니다(이 경우 Program.cs
의 일부).
builder . Services . AddCarter ( configurator : c =>
{
c . WithResponseNegotiator < CustomResponseNegotiator > ( ) ;
c . WithModule < MyModule > ( ) ;
c . WithValidator < TestModelValidator > ( )
} ) ;
여기에서도 Carter는 이미 Newtonsoft.Json
사용하는 응답 협상자와 함께 제공되므로 다음 줄을 사용하여 Newtonsoft 구현을 연결할 수 있습니다.
builder . Services . AddCarter ( configurator : c =>
{
c . WithResponseNegotiator < NewtonsoftJsonResponseNegotiator > ( ) ;
} ) ;