Флаги функций в ASP.NET Core. Продолжение 2
Начало
Продолжение 1
5. Собственные фильтры
Если встроенных фильтров функций недостаточно, у нас есть возможность написать собственные фильтры, реализовав IFeatureFilter. Создадим фильтр, позволяющий использовать функцию только клиентам, у которых установлен определённый язык:
"FeatureManagement": {
"LangFeature": {
"EnabledFor": [
{
"Name": "LangFilter",
"Parameters": {
"AllowedLangs": [
"en-US", "ru-RU"
]
}
}
]
}
}
Мы определяем функцию LangFeature и фильтр LangFilter для неё, добавляя в параметры массив AllowedLangs с языками, для которых функция включена.Создадим LangFilter:
[FilterAlias(nameof(LangFilter))]Сначала внедряем IHttpContextAccessor. Это позволит нам получить доступ к заголовку Accept-Language из запроса пользователя.
public class LangFilter : IFeatureFilter
{
private IHttpContextAccessor _hCA;
public LangFilter(IHttpContextAccessor hCA)
{
_hCA = hCA;
}
public Task<bool> EvaluateAsync(
FeatureFilterEvaluationContext ctx)
{
var userLang = _hCA
.HttpContext
.Request
.Headers["Accept-Language"]
.ToString();
var settings = ctx
.Parameters
.Get<LangFilterSettings>();
return Task.FromResult(
settings.AllowedLangs
.Any(a => userLang.Contains(a)));
}
}
Мы реализуем интерфейс IFeatureFilter, который даёт нам метод EvaluateAsync(). В этом методе мы проверяем язык пользователя по параметрам (settings), определённым в appsettings.json, и возвращаем true, если язык есть в списке. Параметры фильтра в строго типизированном виде нам помогает получить класс FeatureFilterEvaluationContext. Создадим простой класс LangFilterSettings для хранения массива AllowedLangs:
public class LangFilterSettingsПрежде чем протестировать наш фильтр, нужно зарегистрировать в сервисах его и HttpContextAccessor:
{
public string[] AllowedLangs { get; set; }
}
builder.Services.AddFeatureManagement()Проверка аналогична проверке логического фильтра:
.AddFeatureFilter<LangFilter>();
builder.Services.AddHttpContextAccessor();
public async Task<IActionResult> LangFeature()Окончание следует…
{
if (await featureMgr.IsEnabledAsync("LangFeature"))
return Ok("Enabled");
else
return BadRequest("Disabled");
}
Источник: https://code-maze.com/aspnetcore-feature-flags/