private static void GetCandidateTypes(
            IEnumerable <AssemblyScanSettings> assembliesToScan,
            IEnumerable <AssemblyScanSettings> scanIncludeList,
            out Type[] allCandidateTypes,
            out Type[] allNonAbstractCandidateTypes)
        {
            Assembly[] allCandidateAssemblies =
                assembliesToScan
                .Select(x => x.Assembly)
                .Union(scanIncludeList.Select(x => x.Assembly))
                .Distinct()
                .ToArray();

            AssemblyScanSettings[] scanExcludeList =
                MiddlewareClassesDiscovery.FindMiddlewareLocations(allCandidateAssemblies);

            allCandidateTypes = AssemblyScanSettings.FilterClasses(
                scanExcludeList: scanExcludeList,
                scanIncludeList: scanIncludeList,
                types:
                allCandidateAssemblies
                .SelectMany(x => x.GetTypes())
                .Union(scanIncludeList.SelectMany(x => x.Assembly.GetTypes()))
                .Where(t => !t.IsGenericType)
                .Distinct()
                .ToArray());
            allNonAbstractCandidateTypes = allCandidateTypes
                                           .Where(t => !t.IsAbstract)
                                           .ToArray();
        }
Exemple #2
0
        internal static void Scan(this IServiceCollection serviceCollection,
                                  IEnumerable <AssemblyScanSettings> assembliesToScan, IEnumerable <AssemblyScanSettings> scanIncludeList)
        {
            if (assembliesToScan == null || !assembliesToScan.Any())
            {
                throw new ArgumentNullException(nameof(assembliesToScan));
            }
            scanIncludeList = scanIncludeList ?? new List <AssemblyScanSettings>();

            IEnumerable <Type> allCandidateTypes = assembliesToScan.SelectMany(x => x.Assembly.GetTypes())
                                                   .Union(scanIncludeList.SelectMany(x => x.Assembly.GetTypes()))
                                                   .Distinct();
            IEnumerable <Type>     allNonAbstractCandidateTypes = allCandidateTypes.Where(t => !t.IsAbstract);
            IEnumerable <Assembly> allCandidateAssemblies       = assembliesToScan.Select(x => x.Assembly)
                                                                  .Union(scanIncludeList.Select(x => x.Assembly))
                                                                  .Distinct()
                                                                  .ToList();

            IEnumerable <AssemblyScanSettings> scanExcludeList =
                MiddlewareClassesDiscovery.FindMiddlewareLocations(allCandidateAssemblies);

            allCandidateTypes = AssemblyScanSettings.Filter(
                types: allCandidateTypes,
                scanExcludeList: scanExcludeList,
                scanIncludeList: scanIncludeList);


            IEnumerable <DiscoveredReducerClass> discoveredReducerClasses =
                ReducerClassessDiscovery.DiscoverReducerClasses(serviceCollection, allNonAbstractCandidateTypes);

            IEnumerable <DiscoveredReducerMethod> discoveredReducerMethods =
                ReducerMethodsDiscovery.DiscoverReducerMethods(serviceCollection, allCandidateTypes);

            IEnumerable <DiscoveredEffectClass> discoveredEffectClasses =
                EffectClassessDiscovery.DiscoverEffectClasses(serviceCollection, allNonAbstractCandidateTypes);

            IEnumerable <DiscoveredEffectMethod> discoveredEffectMethods =
                EffectMethodsDiscovery.DiscoverEffectMethods(serviceCollection, allCandidateTypes);

            IEnumerable <DiscoveredFeatureClass> discoveredFeatureClasses =
                FeatureClassesDiscovery.DiscoverFeatureClasses(
                    serviceCollection,
                    allNonAbstractCandidateTypes,
                    discoveredReducerClasses,
                    discoveredReducerMethods);

            RegisterStore(
                serviceCollection,
                discoveredFeatureClasses,
                discoveredEffectClasses,
                discoveredEffectMethods);
        }