public virtual async Task <SimpleStateCheckerResult <TState> > IsEnabledAsync(TState[] states) { var result = new SimpleStateCheckerResult <TState>(states); using (var scope = ServiceProvider.CreateScope()) { var batchStateCheckers = states.SelectMany(x => x.StateCheckers) .Where(x => x is ISimpleBatchStateChecker <TState>) .Cast <ISimpleBatchStateChecker <TState> >() .GroupBy(x => x) .Select(x => x.Key); foreach (var stateChecker in batchStateCheckers) { var context = new SimpleBatchStateCheckerContext <TState>( scope.ServiceProvider.GetRequiredService <ICachedServiceProvider>(), states.Where(x => x.StateCheckers.Contains(stateChecker)).ToArray()); foreach (var x in await stateChecker.IsEnabledAsync(context)) { result[x.Key] = x.Value; } if (result.Values.All(x => !x)) { return(result); } } foreach (ISimpleBatchStateChecker <TState> globalStateChecker in Options.GlobalStateCheckers .Where(x => typeof(ISimpleBatchStateChecker <TState>).IsAssignableFrom(x)) .Select(x => ServiceProvider.GetRequiredService(x))) { var context = new SimpleBatchStateCheckerContext <TState>( scope.ServiceProvider.GetRequiredService <ICachedServiceProvider>(), states.Where(x => result.Any(y => y.Key.Equals(x) && y.Value)).ToArray()); foreach (var x in await globalStateChecker.IsEnabledAsync(context)) { result[x.Key] = x.Value; } } foreach (var state in states) { if (result[state]) { result[state] = await InternalIsEnabledAsync(state, false); } } return(result); } }