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 > ( ) ;
} ) ;