コード例 #1
0
ファイル: DependencyScanner.cs プロジェクト: mrpmorris/Fluxor
        internal static void Scan(
            this IServiceCollection serviceCollection,
            FluxorOptions options,
            IEnumerable <AssemblyScanSettings> assembliesToScan,
            IEnumerable <AssemblyScanSettings> scanIncludeList)
        {
            if (assembliesToScan == null || assembliesToScan.Count() == 0)
            {
                throw new ArgumentNullException(nameof(assembliesToScan));
            }

            GetCandidateTypes(
                assembliesToScan: assembliesToScan,
                scanIncludeList: scanIncludeList ?? new List <AssemblyScanSettings>(),
                allCandidateTypes: out Type[] allCandidateTypes,
                allNonAbstractCandidateTypes: out Type[] allNonAbstractCandidateTypes);

            // Classes must not be abstract
            DiscoveredReducerClass[] discoveredReducerClasses =
                ReducerClassessDiscovery.DiscoverReducerClasses(serviceCollection, allNonAbstractCandidateTypes);

            DiscoveredEffectClass[] discoveredEffectClasses =
                EffectClassessDiscovery.DiscoverEffectClasses(serviceCollection, allNonAbstractCandidateTypes);

            // Method reducer/effects may belong to abstract classes
            TypeAndMethodInfo[] allCandidateMethods = AssemblyScanSettings.FilterMethods(allCandidateTypes);

            DiscoveredReducerMethod[] discoveredReducerMethods =
                ReducerMethodsDiscovery.DiscoverReducerMethods(serviceCollection, allCandidateMethods);

            DiscoveredEffectMethod[] discoveredEffectMethods =
                EffectMethodsDiscovery.DiscoverEffectMethods(serviceCollection, allCandidateMethods);

            DiscoveredFeatureClass[] discoveredFeatureClasses =
                FeatureClassesDiscovery.DiscoverFeatureClasses(
                    serviceCollection: serviceCollection,
                    allCandidateTypes: allNonAbstractCandidateTypes,
                    discoveredReducerClasses: discoveredReducerClasses,
                    discoveredReducerMethods: discoveredReducerMethods);

            RegisterStore(
                serviceCollection: serviceCollection,
                options: options,
                discoveredFeatureClasses: discoveredFeatureClasses,
                discoveredEffectClasses: discoveredEffectClasses,
                discoveredEffectMethods: discoveredEffectMethods);
        }
コード例 #2
0
ファイル: DependencyScanner.cs プロジェクト: mrpmorris/Fluxor
        private static void RegisterStore(
            IServiceCollection serviceCollection,
            FluxorOptions options,
            IEnumerable <DiscoveredFeatureClass> discoveredFeatureClasses,
            IEnumerable <DiscoveredEffectClass> discoveredEffectClasses,
            IEnumerable <DiscoveredEffectMethod> discoveredEffectMethods)
        {
            // Register IDispatcher as an alias to Store
            serviceCollection.AddScoped <IDispatcher>(serviceProvider => serviceProvider.GetService <Store>());
            // Register IActionSubscriber as an alias to Store
            serviceCollection.AddScoped <IActionSubscriber>(serviceProvider => serviceProvider.GetService <Store>());
            // Register IStore as an alias to Store
            serviceCollection.AddScoped <IStore>(serviceProvider => serviceProvider.GetService <Store>());

            // Register a custom factory for building IStore that will inject all effects
            serviceCollection.AddScoped(typeof(Store), serviceProvider =>
            {
                var store = new Store();
                foreach (DiscoveredFeatureClass discoveredFeatureClass in discoveredFeatureClasses)
                {
                    var feature = (IFeature)serviceProvider.GetService(discoveredFeatureClass.FeatureInterfaceGenericType);
                    store.AddFeature(feature);
                }

                foreach (DiscoveredEffectClass discoveredEffectClass in discoveredEffectClasses)
                {
                    var effect = (IEffect)serviceProvider.GetService(discoveredEffectClass.ImplementingType);
                    store.AddEffect(effect);
                }

                foreach (DiscoveredEffectMethod discoveredEffectMethod in discoveredEffectMethods)
                {
                    IEffect effect = EffectWrapperFactory.Create(serviceProvider, discoveredEffectMethod);
                    store.AddEffect(effect);
                }

                foreach (Type middlewareType in options.MiddlewareTypes)
                {
                    var middleware = (IMiddleware)serviceProvider.GetService(middlewareType);
                    store.AddMiddleware(middleware);
                }

                return(store);
            });
        }