Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

3 года назад
Открыть в
День 1493. #ЗаметкиНаПолях #TipsAndTricks Используем Сгенерированное Регулярное Выражение в Ограничениях Маршрута ASP.NET Core Регулярное выражение на основе сгенерированного кода предоставляет несколько преимуществ по сравнению с традиционным классом Regex: - Более быстрое время запуска, так как весь код генерируется во время компиляции. Не нужно анализировать шаблон регулярного выражения и генерировать оптимизированный код для выполнения регулярного выражения во время выполнения. - Улучшенная поддержка тримминга. Код, который не используется, не включается в окончательный бинарный файл. - Улучшенная поддержка отладки. Вы можете пройтись по коду и посмотреть, что происходит. Чтобы использовать генератор исходного кода для регулярных выражений, вам необходимы .NET 7 и C# 11. Для стандартных регулярных выражений IDE вроде Visual Studio или Rider даже предложат вам автоматически преобразовать их на использование генераторов кода. Маршрутизация ASP.NET Core позволяет устанавливать ограничения на параметры маршрута. Ограничение может быть шаблоном регулярного выражения. В большинстве случаев этот шаблон – строковая константа:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseRouting();

app.MapGet(
  "{value:regex(^([01]?[0-9]|2[0-3]):[0-5][0-9]$)}",
  (string value) => "Время: " + value);

app.Run();

Этот код гарантирует, что параметр value соответствует времени в 24-часовом формате. Однако ASP.NET Core предоставляет возможность создавать собственные ограничения путем реализации IRouteConstraint или наследования от класса, реализующего этот интерфейс. В этом случае вы можете использовать RegexRouteConstraint и предоставить регулярное выражение в конструкторе:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRouting(options =>
{
  // регистрируем ограничение
  options.ConstraintMap.Add(
   "time", typeof(TimeRouteConstraint));
});

var app = builder.Build();
app.UseRouting();

app.MapGet(
 "{value:time}",
 (string value) => "Время: " + value);

app.Run();

sealed partial class TimeRouteConstraint
 : RegexRouteConstraint
{
  [GeneratedRegex("^([01]?[0-9]|2[0-3]):[0-5][0-9]$")]
  private static partial Regex TimeRegex();

  public TimeRouteConstraint()
    : base(TimeRegex())
  {
  }
}

Источник: https://www.meziantou.net/using-source-generated-regex-in-asp-net-core-routing.htm