Carter adalah kerangka kerja yang merupakan lapisan tipis metode ekstensi dan fungsionalitas di atas ASP.NET Core yang memungkinkan kode menjadi lebih eksplisit dan yang terpenting lebih menyenangkan.
Untuk pemahaman yang lebih baik, perhatikan baik-baik contoh di dalam repo ini. Sampel menunjukkan penggunaan ekstensi elegan di sekitar tipe ASP.NET Core yang umum seperti yang ditunjukkan di bawah ini.
Ekstensi lainnya meliputi:
Validate<T> / ValidateAsync<T>
- Ekstensi FluentValidation untuk memvalidasi permintaan HTTP masuk yang tidak tersedia dengan ASP.NET Core Minimal API.BindFile/BindFiles/BindFileAndSave/BindFilesAndSave
- Memungkinkan Anda dengan mudah mendapatkan akses ke suatu file/file yang telah diunggah. Alternatifnya, Anda dapat menghubungi BindFilesAndSave
dan ini akan menyimpannya ke jalur yang Anda tentukan.app.UseExceptionHandler("/errorhandler");
.IResponseNegotiator
memungkinkan Anda menentukan tampilan respons pada header Terima tertentu (negosiasi konten). Penanganan JSON dibangun dalam respons default tetapi penerapan antarmuka memungkinkan pengguna memilih bagaimana mereka ingin merepresentasikan sumber daya. Carter menggunakan perutean IEndpointRouteBuilder
dan semua ekstensi yang ditawarkan IEndpointConventionBuilder
yang juga dikenal sebagai API Minimal. Misalnya Anda dapat menentukan rute dengan otorisasi yang diperlukan seperti:
app . MapGet ( " / " , ( ) => " There's no place like 127.0.0.1 " ) . RequireAuthorization ( ) ;
Saya telah menjadi penggemar berat, dan kontributor inti Nancy, kerangka web .NET terbaik, selama bertahun-tahun, dan nama "Nancy" muncul karena terinspirasi dari kerangka web Sinatra, Ruby. Frank Sinatra memiliki seorang putri bernama Nancy dan dari situlah asalnya.
Saya juga mencoba memikirkan nama turunannya, dan baru-baru ini saya mendengarkan lagu Empire State of Mind di mana Jay-Z menyatakan dia adalah Sinatra baru. Nama aslinya adalah Shaun Carter jadi saya ambil Carter dan inilah kita!
Jika Anda ingin mencoba versi terbaru dari cabang master, tambahkan https://f.feedz.io/carter/carter/nuget/index.json
ke NuGet.config Anda dan ambil versi Carter terbaru dan terhebat.
Anda dapat mulai menggunakan templat atau dengan menambahkan paket secara manual ke aplikasi baru atau yang sudah ada.
https://www.nuget.org/packages/CarterTemplate/
Instal template - dotnet new install CarterTemplate
Buat aplikasi baru menggunakan template - dotnet new carter -n MyCarterApp -o MyCarterApp
Masuk ke direktori baru yang dibuat untuk cd MyCarterApp
Jalankan aplikasi - dotnet run
https://www.nuget.org/packages/Carter
Buat aplikasi ASP.NET Core baru yang kosong - dotnet new web -n MyCarterApp
Ubah ke lokasi proyek baru - cd ./MyCarterApp
Tambahkan paket Carter - dotnet add package carter
Ubah Program.cs Anda untuk menggunakan Carter
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
}
}
Lebih banyak sampel
Seperti disebutkan sebelumnya, Carter akan memindai implementasi di aplikasi Anda dan mendaftarkannya untuk DI. Namun, jika Anda menginginkan aplikasi yang lebih terkontrol, Carter hadir dengan CarterConfigurator
yang memungkinkan Anda mendaftarkan modul, validator, dan negosiator respons secara manual.
Carter akan menggunakan negosiator respons berdasarkan System.Text.Json
, meskipun ia menyediakan implementasi khusus melalui antarmuka IResponseNegotiator
. Untuk menggunakan implementasi IResponseNegotiator
Anda sendiri (misalnya, CustomResponseNegotiator
), tambahkan baris berikut ke konfigurasi awal Carter, dalam hal ini sebagai bagian dari Program.cs
:
builder . Services . AddCarter ( configurator : c =>
{
c . WithResponseNegotiator < CustomResponseNegotiator > ( ) ;
c . WithModule < MyModule > ( ) ;
c . WithValidator < TestModelValidator > ( )
} ) ;
Di sini sekali lagi, Carter sudah mengirimkan negosiator respons menggunakan Newtonsoft.Json
, sehingga Anda dapat menyambungkan implementasi Newtonsoft dengan baris berikut:
builder . Services . AddCarter ( configurator : c =>
{
c . WithResponseNegotiator < NewtonsoftJsonResponseNegotiator > ( ) ;
} ) ;