Esempio n. 1
0
    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);
        }
    }