Используйте ведение журнала и внедрение внедрения в минимальных API в ASP.NET Core 6.

автор vadim


ASP.NET Core 6 представляет упрощенную модель хостинга, которую можно использовать для реализации облегченных API с минимальными зависимостями. Эти минимальные API-интерфейсы значительно сокращают количество шаблонного кода, который необходимо написать для запуска и работы приложений ASP.NET Core 6.

В предыдущей статье мы обсуждали, как начать работу с минимальными API. В этой статье мы рассмотрим более сложные аспекты минимальных API, включая реализацию ведения журналов, чтение из системы конфигурации и использование внедрения зависимостей.

Для работы с примерами кода, представленными в этой статье, в вашей системе должна быть установлена ​​Visual Studio 2022. Если у вас еще нет копии, вы можете скачать Visual Studio 2022 здесь.

Создайте минимальный проект веб-API ASP.NET Core в Visual Studio 2022.

Прежде всего давайте создадим проект ASP.NET Core в Visual Studio 2022. Выполнение этих шагов позволит создать новый проект ASP.NET Core Web API 6 в Visual Studio 2022:

  1. Запустите интегрированную среду разработки Visual Studio 2022.
  2. Нажмите «Создать новый проект».
  3. В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
  4. Нажмите “Далее.
  5. В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
  6. При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
  7. Нажмите “Далее.
  8. В следующем окне «Дополнительная информация» снимите флажок «Использовать контроллеры…», поскольку в этом примере мы будем использовать минимальные API. В поле «Тип аутентификации» оставьте значение «Нет» (по умолчанию).
  9. Убедитесь, что флажки «Включить Docker», «Настроить HTTPS» и «Включить поддержку Open API» сняты, поскольку мы не будем здесь использовать ни одну из этих функций.
  10. Нажмите Создать.

В результате будет создан новый проект веб-API ASP.NET Core 6 в Visual Studio 2022. В последующих разделах этой статьи мы будем использовать этот проект для работы с минимальным API.

Запустите минимальный веб-API

Вы можете заставить свой минимальный API работать всего с помощью нескольких строк кода:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("https://www.infoworld.com/", () => "This is an example of a minimal API");
app.Run();

Настройте несколько портов для минимального веб-API.

Следующий фрагмент кода показывает, как можно настроить минимальный API для работы на одном конкретном порту.

var app = WebApplication.Create(args);
app.MapGet("https://www.infoworld.com/", () => "Hello World!");
app.Run("http://localhost:5178");

Когда вы запустите приложение и перейдете по этому URL-адресу, вы должны увидеть надпись «Hello World!» сообщение, отображаемое в вашем веб-браузере.

Вы можете использовать несколько портов, добавив URL-адреса, как показано в следующем фрагменте кода.

app.Urls.Add("http://localhost:5178");
app.Urls.Add("http://localhost:5179");

В этом случае, если вы перейдете к любой из этих конечных точек, тот же «Hello World!» будет отображено сообщение.

Вы даже можете прочитать порт из среды, как показано в фрагменте кода, приведенном ниже.

var app = WebApplication.Create(args);
var port = Environment.GetEnvironmentVariable("PORT") ?? "5155";
app.MapGet("https://www.infoworld.com/", () => "Hello World!");
app.Run($"http://localhost:{port}");

Используйте вход в минимальный веб-API

Вы также можете использовать вход в свои минимальные API. Вот как вы можете записать данные в консоль с помощью Serilog:

var logger = new LoggerConfiguration()
    .WriteTo.Console()
    .CreateLogger();

Вы можете использовать Serilog для создания журналов, которые также сохраняют перезапуски приложений. Serilog поддерживает ведение журналов в базе данных, файле, облачном хранилище и других целях. Следующий фрагмент кода показывает, как можно использовать Serilog в минимальных API.

var builder = WebApplication.CreateBuilder(args);
Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.File("logs.txt", rollingInterval: RollingInterval.Day)
    .CreateLogger();

В следующем фрагменте кода показано, как можно использовать ведение журнала в минимальном API.

app.MapGet("https://www.infoworld.com/", (ILoggerFactory loggerFactory) => {
    var logger = loggerFactory.CreateLogger("Start");
    logger.LogInformation("Starting...");
    return "Logging at work!";
});

Чтение из системы конфигурации в минимальном API

Вы также можете прочитать данные из системы конфигурации в своем минимальном API. Следующий фрагмент кода показывает, как этого можно достичь.

var app = WebApplication.Create(args);
var message = app.Configuration["TextMessage"] ?? "This is a default message.";
app.MapGet("https://www.infoworld.com/", () => message);
app.Run();

Используйте внедрение зависимостей в минимальном веб-API.

Если вы хотите использовать экземпляр HttpClient для подключения к удаленному ресурсу, вы можете использовать внедрение зависимостей, как показано в приведенном ниже фрагменте кода.

app.MapGet("https://www.infoworld.com/", (IHttpClientFactory httpClientFactory) => "Inside HttpGet method");

Не забудьте добавить HttpClient в контейнер, используя следующий код.

builder.Services.AddHttpClient();

Вы также можете воспользоваться преимуществами внедрения зависимостей в методе HttpPost. В приведенном ниже фрагменте кода показано, как передать экземпляр IHttpClientFactory в качестве параметра в метод HttpPost.

app.MapPost("https://www.infoworld.com/", (IHttpClientFactory httpClientFactory) =>
{
    var client = httpClientFactory.CreateClient();
    return Results.Ok();
});

Внедрить собственный класс в минимальный веб-API

Вы также можете внедрить экземпляр пользовательского класса в свой минимальный API. Чтобы проиллюстрировать это, давайте реализуем два типа: интерфейс IAuthorRepository и класс AuthorRepository. Мы будем использовать эти типы для реализации внедрения зависимостей в нашем минимальном API.

Создайте новый файл с именем IAuthorRepository.cs и вставьте следующий код:

    public interface IAuthorRepository
    {
        public List<Author> GetAuthors();
        public Author GetAuthor(int id);
    }

Класс AuthorRepository реализует интерфейс IAuthorRepository, как показано ниже.

 public class AuthorRepository: IAuthorRepository
    {
        private readonly List<Author> _authors;
        public AuthorRepository()
        {
            _authors = new List<Author>
            {
                new Author
                {
                    Id = 1,
                    FirstName = "Joydip",
                    LastName = "Kanjilal"
                },
                new Author
                {
                    Id = 2,
                    FirstName = "Steve",
                    LastName = "Smith"
                },
                new Author
                {
                    Id = 3,
                    FirstName = "Julie",
                    LastName = "Lerman"
                },
                new Author
                {
                    Id = 4,
                    FirstName = "Simon",
                    LastName = "Bisson"
                }
            };
        }
        public List<Author> GetAuthors()
        {
            return _authors;
        }
        public Author GetAuthor(int id)
        {
            return _authors.Find(x=> x.Id == id);
        }
    }

Внедрите собственный интерфейс в минимальный веб-API.

Следующий фрагмент кода показывает, как можно внедрить экземпляр интерфейса IAuthorRepository.

app.MapGet("api/author/{id:int}", async (IAuthorRepository authorRepository, HttpContext httpContext) =>
{
    var id = int.Parse((string)httpContext.Request.RouteValues["id"]);
    var author = authorRepository.GetAuthor(id);
    if (author == null)
    {
        return Results.NotFound();
    }
    return Results.Ok(author);
});

Наконец, .NET 6 включает в себя замечательную новую функцию — глобальное использование директив. Чтобы использовать глобальное использование, создайте новый файл с именем usings.cs и переместите туда все ваши операторы using. Вы можете использовать эту функцию с API-интерфейсами ASP.NET Core 6 или минимальными API.

Подробнее о минимальных API (таких как работа с безопасностью и промежуточным программным обеспечением) я расскажу в следующей статье.

Related Posts

Оставить комментарий