Carter — это платформа, представляющая собой тонкий слой методов расширения и функциональности поверх ASP.NET Core, позволяющий сделать код более явным и, что наиболее важно, более приятным.
Для лучшего понимания внимательно посмотрите на примеры внутри этого репозитория. В примерах демонстрируется использование элегантных расширений для распространенных типов ASP.NET Core, как показано ниже.
Другие расширения включают в себя:
Validate<T> / ValidateAsync<T>
— расширения FluentValidation для проверки входящих HTTP-запросов, которые недоступны с минимальными API-интерфейсами ASP.NET Core.BindFile/BindFiles/BindFileAndSave/BindFilesAndSave
— позволяет легко получить доступ к загруженному файлу/файлам. В качестве альтернативы вы можете вызвать BindFilesAndSave
, и это сохранит его по указанному вами пути.app.UseExceptionHandler("/errorhandler");
.IResponseNegotiator
позволяет вам определить, как должен выглядеть ответ на определенный заголовок Accept (согласование содержимого). Обработка JSON встроена в ответ по умолчанию, но реализация интерфейса позволяет пользователю выбирать, как он хочет представлять ресурсы. Картер использует маршрутизацию IEndpointRouteBuilder
и все расширения, предлагаемые IEndpointConventionBuilder
также известные как минимальные API. Например, вы можете определить маршрут с необходимой авторизацией следующим образом:
app . MapGet ( " / " , ( ) => " There's no place like 127.0.0.1 " ) . RequireAuthorization ( ) ;
Я являюсь большим поклонником и основным участником Nancy, лучшей веб-платформы .NET, на протяжении многих лет, а название «Нэнси» появилось благодаря тому, что оно было вдохновлено веб-фреймворком Sinatra Ruby. У Фрэнка Синатры была дочь по имени Нэнси, вот откуда это взялось.
Я также пытался придумать производное имя и недавно слушал песню Empire State of Mind, где Jay-Z заявляет, что он новый Синатра. Его настоящее имя — Шон Картер, поэтому я взял Картера, и вот мы здесь!
Если вы хотите попробовать последние сборки из основной ветки, добавьте 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
Добавить пакет Carter — dotnet add package 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
}
}
Больше образцов
Как упоминалось ранее, Картер просканирует реализации в вашем приложении и зарегистрирует их для 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 > ( )
} ) ;
И здесь Carter уже поставляется с переговорщиком ответа, использующим Newtonsoft.Json
, поэтому вы можете подключить реализацию Newtonsoft с помощью следующей строки:
builder . Services . AddCarter ( configurator : c =>
{
c . WithResponseNegotiator < NewtonsoftJsonResponseNegotiator > ( ) ;
} ) ;