File: System\Composition\Debugging\ContainerConfigurationDebuggerProxy.cs
Web Access
Project: src\src\libraries\System.Composition.TypedParts\src\System.Composition.TypedParts.csproj (System.Composition.TypedParts)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections.Generic;
using System.Composition.Hosting;
using System.Composition.Hosting.Core;
using System.Composition.TypedParts;
using System.Composition.TypedParts.Discovery;
using System.Composition.TypedParts.Util;
using System.Diagnostics;
using System.Reflection;
 
namespace System.Composition.Debugging
{
    internal sealed class ContainerConfigurationDebuggerProxy
    {
        private readonly ContainerConfiguration _configuration;
        private DiscoveredPart[] _discoveredParts;
        private Type[] _ignoredTypes;
 
        public ContainerConfigurationDebuggerProxy(ContainerConfiguration configuration)
        {
            _configuration = configuration;
        }
 
        [DebuggerDisplay("Added Providers")]
        public ExportDescriptorProvider[] AddedExportDescriptorProviders
        {
            get { return _configuration.DebugGetAddedExportDescriptorProviders(); }
        }
 
        [DebuggerDisplay("Discovered Parts")]
        public DiscoveredPart[] DiscoveredParts
        {
            get
            {
                InitDiscovery();
                return _discoveredParts;
            }
        }
 
        [DebuggerDisplay("Ignored Types")]
        public Type[] IgnoredTypes
        {
            get
            {
                InitDiscovery();
                return _ignoredTypes;
            }
        }
 
        private void InitDiscovery()
        {
            if (_discoveredParts != null)
                return;
 
            var types = _configuration.DebugGetRegisteredTypes();
            var defaultAttributeContext = _configuration.DebugGetDefaultAttributeContext() ?? new DirectAttributeContext();
            var discovered = new List<DiscoveredPart>();
            var ignored = new List<Type>();
 
            foreach (var typeSet in types)
            {
                var ac = typeSet.Item2 ?? defaultAttributeContext;
                var activationFeatures = TypedPartExportDescriptorProvider.DebugGetActivationFeatures(ac);
                var inspector = new TypeInspector(ac, activationFeatures);
 
                foreach (var type in typeSet.Item1)
                {
                    DiscoveredPart part;
                    if (inspector.InspectTypeForPart(type.GetTypeInfo(), out part))
                        discovered.Add(part);
                    else
                        ignored.Add(type);
                }
            }
 
            _discoveredParts = discovered.ToArray();
            _ignoredTypes = ignored.ToArray();
        }
    }
}