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:
- Запустите интегрированную среду разработки Visual Studio 2022.
- Нажмите «Создать новый проект».
- В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
- Нажмите “Далее.
- В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
- При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
- Нажмите “Далее.
- В следующем окне «Дополнительная информация» снимите флажок «Использовать контроллеры…», поскольку в этом примере мы будем использовать минимальные API. В поле «Тип аутентификации» оставьте значение «Нет» (по умолчанию).
- Убедитесь, что флажки «Включить Docker», «Настроить HTTPS» и «Включить поддержку Open API» сняты, поскольку мы не будем здесь использовать ни одну из этих функций.
- Нажмите Создать.
В результате будет создан новый проект веб-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 (таких как работа с безопасностью и промежуточным программным обеспечением) я расскажу в следующей статье.