Carter 是一個框架,它是 ASP.NET Core 上擴展方法和功能的薄層,允許程式碼更明確,最重要的是更令人愉快。
為了更好地理解,請仔細查看此存儲庫中的範例。這些範例示範了圍繞常見 ASP.NET Core 類型的優雅擴充功能的用法,如下所示。
其他擴充包括:
Validate<T> / ValidateAsync<T>
- FluentValidation 擴展,用於驗證傳入的 HTTP 請求,這在 ASP.NET Core Minimal API 中不可用。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 Web 框架 Nancy 的忠實粉絲和核心貢獻者,「Nancy」這個名字的靈感來自於 Ruby Web 框架 Sinatra。法蘭克辛納屈 (Frank Sinatra) 有一個女兒,名叫南希 (Nancy),這就是它的由來。
我也在試著想一個衍生的名字,我最近聽了歌曲《Empire State of Mind》,其中 Jay-Z 宣稱他是新的 Sinatra。他的真名是肖恩卡特,所以我帶了卡特,我們就在這裡!
如果您想嘗試 master 分支的最新版本,請將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 > ( ) ;
} ) ;