Используя .NET Core 6, я пытаюсь использовать FeatureManager, но когда я создаю пользовательский фильтр со своим собственным контекстом, фильтр не оценивается, и IsEnabledAsync всегда возвращает false. Никаких ошибок или исключений не возникает. Я проверил, что простые флаги включения/выключения работают должным образом, например:
"FeatureManagement": {
"ShowLearningGoalsToCourseDirectors": true
}
Это код в appsettings.json
"FeatureManagement": {
"ShowLearningGoalsToCourseDirectors": {
"EnabledFor": {
"Name": "PhaseFilter",
"Parameters": {
"AllowedPhases": "FCC"
}
}
}
}
Это моя текущая реализация пользовательского фильтра. В настоящее время меня не интересует, как оценивается фильтр, поэтому он просто проверяет, превышает ли длина переданной строки фазы 0.
[FilterAlias("PhaseFilter")]
public class PhaseFilter : IContextualFeatureFilter<PhaseContext>
{
public Task<bool> EvaluateAsync(FeatureFilterEvaluationContext featureFilterContext, PhaseContext phaseContext)
{
var allowedPhases = featureFilterContext.Parameters.GetSection("AllowedPhases").Value;
var phases = phaseContext.Phases;
if (phases.Length > 0)
{
return Task.FromResult(true);
}
else
{
return Task.FromResult(false);
}
}
public class PhaseContext
{
public string Phases { get; set; }
}
public class PhaseFilterSettings
{
public string AllowedPhases { get; set; }
}
Наконец, это моя регистрация в Startup.cs в методе ConfigurationServices.
services.AddFeatureManagement().AddFeatureFilter<PhaseFilter>();
Я пытаюсь таким образом оценить флаг функции с помощью фильтра.
string phases = "test";
bool isEnabled = await _featureManager.IsEnabledAsync("ShowLearningGoalsToCourseDirectors", new PhaseContext() { Phases = phases });
На самом деле проблема заключалась в синтаксисе определения фильтра в файле .json. Включено для массива, поэтому вместо использования {} мне нужно было использовать []. Это сработало.
"FeatureManagement": {
"ShowLearningGoalsToCourseDirectors": {
"EnabledFor": [
"Name": "PhaseFilter",
"Parameters": {
"AllowedPhases": "FCC"
}
]
}
}