bool IsFeatureRequired(ShellFeature feature)
        {
            // Mark SetUp as required
            if (feature.ModuleId.Equals("Plato.SetUp", StringComparison.InvariantCultureIgnoreCase))
            {
                return(true);
            }
            // Returns true if the supplied feature exists within our minimal shell descriptor
            var minimalDescriptor = _shellContextFactory.MinimumShellDescriptor();

            return(minimalDescriptor.Modules.FirstOrDefault(m => m.ModuleId.Equals(feature.ModuleId, StringComparison.OrdinalIgnoreCase)) != null);
        }
        async Task EnsureFeaturesLoadedAsync()
        {
            if (_features == null)
            {
                _features = new ConcurrentDictionary <string, IShellFeature>();
                var modules = await _moduleManager.LoadModulesAsync();

                if (modules != null)
                {
                    // Get explicitly enabled features
                    var enabledFeatures = await GetEnabledFeaturesAsync();

                    var enabledFeatureNames = enabledFeatures
                                              .Select(f => f.ModuleId).ToArray();

                    // Build features and dependencies
                    foreach (var module in modules)
                    {
                        var feature = new ShellFeature(module);
                        feature.IsRequired = IsFeatureRequired(feature);

                        if (enabledFeatureNames.Contains(module.Descriptor.Id))
                        {
                            feature.IsEnabled = true;
                        }

                        foreach (var dependency in module.Descriptor.Dependencies)
                        {
                            if (enabledFeatureNames.Contains(dependency.Id))
                            {
                                dependency.IsEnabled = true;
                            }
                        }

                        _features.TryAdd(module.Descriptor.Id, feature);
                    }
                }
            }
        }