Carter هو إطار عمل عبارة عن طبقة رقيقة من أساليب الامتداد والوظائف عبر ASP.NET Core مما يسمح للتعليمات البرمجية بأن تكون أكثر وضوحًا والأهم من ذلك أنها أكثر متعة.
للحصول على فهم أفضل، قم بإلقاء نظرة فاحصة على العينات الموجودة داخل هذا الريبو. توضح العينات استخدامات الامتدادات الأنيقة حول أنواع ASP.NET Core الشائعة كما هو موضح أدناه.
تشمل الملحقات الأخرى ما يلي:
Validate<T> / ValidateAsync<T>
- ملحقات FluentValidation للتحقق من صحة طلبات HTTP الواردة والتي لا تتوفر مع واجهات برمجة تطبيقات ASP.NET Core Minimal.BindFile/BindFiles/BindFileAndSave/BindFilesAndSave
- يتيح لك الوصول بسهولة إلى الملف/الملفات التي تم تحميلها. وبدلاً من ذلك، يمكنك الاتصال BindFilesAndSave
وسيؤدي ذلك إلى حفظه في المسار الذي تحدده.app.UseExceptionHandler("/errorhandler");
.IResponseNegotiator
بتحديد الشكل الذي يجب أن تبدو عليه الاستجابة في رأس قبول معين (التفاوض على المحتوى). تم إنشاء التعامل مع JSON في الاستجابة الافتراضية ولكن تنفيذ الواجهة يسمح للمستخدم باختيار الطريقة التي يريد بها تمثيل الموارد. يستخدم كارتر توجيه IEndpointRouteBuilder
وجميع الامتدادات التي يقدمها IEndpointConventionBuilder
والتي تُعرف أيضًا باسم Minimal APIs. على سبيل المثال، يمكنك تحديد مسار يتطلب التفويض كما يلي:
app . MapGet ( " / " , ( ) => " There's no place like 127.0.0.1 " ) . RequireAuthorization ( ) ;
لقد كنت من أشد المعجبين بإطار عمل الويب .NET الأفضل ومساهم أساسي في Nancy لسنوات عديدة، وقد جاء اسم "Nancy" نظرًا لأنه مستوحى من إطار عمل الويب Sinatra Ruby. كان لفرانك سيناترا ابنة اسمها نانسي، ومن هنا أتت.
كنت أحاول أيضًا التفكير في اسم مشتق، وقد استمعت مؤخرًا إلى أغنية Empire State of Mind حيث أعلن جاي زي أنه سيناترا الجديد. اسمه الحقيقي هو شون كارتر لذا أخذت كارتر وها نحن هنا!
إذا كنت ترغب في تجربة أحدث الإصدارات من الفرع الرئيسي، أضف 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
}
}
المزيد من العينات
كما ذكرنا سابقًا، سيقوم كارتر بالبحث عن التطبيقات في تطبيقك وتسجيلها في DI. ومع ذلك، إذا كنت تريد تطبيقًا أكثر تحكمًا، فإن Carter يأتي مع CarterConfigurator
الذي يسمح لك بتسجيل الوحدات والمدققين ومفاوضي الاستجابة يدويًا.
سيستخدم كارتر مفاوض الاستجابة استنادًا إلى System.Text.Json
، على الرغم من أنه يوفر تطبيقات مخصصة عبر واجهة IResponseNegotiator
. لاستخدام تطبيق IResponseNegotiator
الخاص بك (على سبيل المثال، CustomResponseNegotiator
)، أضف السطر التالي إلى تكوين Carter الأولي، في هذه الحالة كجزء من Program.cs
:
builder . Services . AddCarter ( configurator : c =>
{
c . WithResponseNegotiator < CustomResponseNegotiator > ( ) ;
c . WithModule < MyModule > ( ) ;
c . WithValidator < TestModelValidator > ( )
} ) ;
هنا مرة أخرى، يأتي كارتر بالفعل مع مفاوضي الاستجابة باستخدام Newtonsoft.Json
، لذا يمكنك توصيل تطبيق Newtonsoft بالسطر التالي:
builder . Services . AddCarter ( configurator : c =>
{
c . WithResponseNegotiator < NewtonsoftJsonResponseNegotiator > ( ) ;
} ) ;