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
提供する Minimal API とも呼ばれるすべての拡張機能を使用します。たとえば、次のように承認が必要なルートを定義できます。
app . MapGet ( " / " , ( ) => " There's no place like 127.0.0.1 " ) . RequireAuthorization ( ) ;
私は長年にわたり、最高の .NET Web フレームワークである Nancy の大ファンであり、中心的な貢献者でもあります。「Nancy」という名前は、Ruby Web フレームワークである Sinatra からインスピレーションを得たものであるため付けられました。フランク・シナトラにはナンシーという娘がいましたが、そこからこの名前が生まれました。
私も派生的な名前を考えようとしていたのですが、ジェイ・Zが自分が新しいシナトラであると宣言するエンパイア・ステート・オブ・マインドという曲を最近聴いていました。彼の本名はショーン・カーターなので、私はカーターを連れてここにいます!
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
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 に登録します。ただし、より制御されたアプリが必要な場合は、モジュール、バリデーター、および応答ネゴシエーターを手動で登録できるCarterConfigurator
が Carter に付属しています。
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 > ( ) ;
} ) ;