Carter เป็นเฟรมเวิร์กที่เป็นชั้นบางๆ ของวิธีการขยายและฟังก์ชันการทำงานบน ASP.NET Core ทำให้โค้ดมีความชัดเจนมากขึ้นและที่สำคัญที่สุดคือสนุกสนานยิ่งขึ้น
เพื่อความเข้าใจที่ดีขึ้น โปรดดูตัวอย่างภายใน Repo นี้ให้ดียิ่งขึ้น ตัวอย่างแสดงให้เห็นถึงการใช้งานส่วนขยายที่หรูหราสำหรับประเภท ASP.NET Core ทั่วไปดังที่แสดงด้านล่าง
ส่วนขยายอื่น ๆ ได้แก่ :
Validate<T> / ValidateAsync<T>
- ส่วนขยาย FluentValidation เพื่อตรวจสอบคำขอ HTTP ขาเข้าซึ่งไม่สามารถใช้งานได้กับ ASP.NET Core Minimal APIBindFile/BindFiles/BindFileAndSave/BindFilesAndSave
- ช่วยให้คุณเข้าถึงไฟล์/ไฟล์ที่อัปโหลดได้อย่างง่ายดาย หรือคุณสามารถเรียก BindFilesAndSave
และจะบันทึกลงในเส้นทางที่คุณระบุapp.UseExceptionHandler("/errorhandler");
-IResponseNegotiator
ช่วยให้คุณสามารถกำหนดว่าการตอบสนองควรมีลักษณะอย่างไรในส่วนหัว Accept บางอย่าง (การเจรจาต่อรองเนื้อหา) การจัดการ JSON สร้างขึ้นในการตอบกลับเริ่มต้น แต่การใช้อินเทอร์เฟซทำให้ผู้ใช้สามารถเลือกวิธีที่พวกเขาต้องการแสดงทรัพยากรได้ Carter ใช้การกำหนดเส้นทาง IEndpointRouteBuilder
และส่วนขยายทั้งหมดที่ IEndpointConventionBuilder
เสนอให้หรือที่เรียกว่า Minimal API ตัวอย่างเช่น คุณสามารถกำหนดเส้นทางโดยต้องมีการอนุญาตดังนี้:
app . MapGet ( " / " , ( ) => " There's no place like 127.0.0.1 " ) . RequireAuthorization ( ) ;
ฉันเป็นแฟนตัวยงของ Nancy ซึ่งเป็นผู้สนับสนุนหลักของ Nancy ซึ่งเป็นเฟรมเวิร์กเว็บ .NET ที่ดีที่สุดมาหลายปีแล้ว และชื่อ "Nancy" เกิดขึ้นเนื่องจากได้รับแรงบันดาลใจจาก Sinatra the Ruby web framework Frank Sinatra มีลูกสาวคนหนึ่งชื่อ Nancy และนั่นคือที่มา
ฉันยังพยายามคิดถึงชื่อที่ลอกเลียนมาด้วย และเมื่อไม่นานมานี้ฉันเพิ่งฟังเพลง Empire State of Mind ที่ Jay-Z ประกาศว่าเขาคือซินาตร้าคนใหม่ ชื่อจริงของเขาคือ Shaun Carter ดังนั้นฉันจึงพา Carter มาที่นี่!
หากคุณต้องการลองบิลด์ล่าสุดจากสาขาหลัก ให้เพิ่ม https://f.feedz.io/carter/carter/nuget/index.json
ลงใน NuGet.config ของคุณ และเลือก 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
แก้ไข Program.cs ของคุณเพื่อใช้ 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
}
}
ตัวอย่างเพิ่มเติม
ตามที่กล่าวไว้ก่อนหน้านี้ 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 > ( ) ;
} ) ;