Определение своего типа IResult

Последнее обновление: 06.02.2022

Встроенные типы Result API покрывают различные ситуации. Однако встроенных типов может оказаться недостаточно. И в этом случае мы можем определить свой тип IResult.

Например, по умолчанию Results API не предоставляет типа для отправки кода html. Рассмотрим, как мы можем сделать IResult для отправки html.

Для этого определим следующий код приложения:

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

// отправляем html-код при обращении по пути "/"
app.Map("/", () => Results.Extensions.Html(@"<!DOCTYPE html>
<html>
<head>
<title>METANIT.COM</title>
<meta charset='utf-8' />
</head>
<body>
<h1>Hello METANIT.COM</h1>
</body>
</html>
"));

app.Run();

class HtmlResult: IResult
{
    string htmlCode = "";
    public HtmlResult(string htmlCode) => this.htmlCode = htmlCode;

    public async Task ExecuteAsync(HttpContext context)
    {
        context.Response.ContentType = "text/html; charset=utf-8";
        await context.Response.WriteAsync(htmlCode);
    }
}

static class ResultsHtmlExtension
{
    public static IResult Html(this IResultExtensions ext, string htmlCode) => new HtmlResult(htmlCode);
}

Ключевым моментом здесь является класс HtmlResult, который собственно и отправляет html-код:

class HtmlResult: IResult
{
    string htmlCode = "";
    public HtmlResult(string htmlCode) => this.htmlCode = htmlCode;

    public async Task ExecuteAsync(HttpContext context)
    {
        context.Response.ContentType = "text/html; charset=utf-8";
        await context.Response.WriteAsync(htmlCode);
    }
}

Он должен реализовать интерфейс IResult, который определяет метод ExecuteAsync()

Через конструктор класса получаем отправляемый код html. А в методе ExecuteAsync() через параметр типа HttpContext установливаем заголовок и отправляем html-код.

Для создания данного объекта можно определить метод расширения для типа IResultExtensions:

static class ResultsHtmlExtension
{
    public static IResult Html(this IResultExtensions ext, string htmlCode) => new HtmlResult(htmlCode);
}

Затем мы можем применить данный метод для отправки ответа при обращении к какой-нибудь конечной точке:

app.Map("/", () => Results.Extensions.Html(@"<!DOCTYPE html>...."));

Хотя в приницпе также можно было бы напрямую создать объект HtmlResult:

app.Map("/", () => new HtmlResult@"<!DOCTYPE html>...."));

Но в любом случае при обращении по адресу "/" приложение отправит html-код, который отобразит браузер.

Создание своего типа IResult для отправки кода html в ASP.NET Core и C#
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850