/// <summary>Adds Proof-of-Authority mining to the side chain node.</summary>
        /// <typeparam name="T">The type of block definition to use.</typeparam>
        public static IFullNodeBuilder AddPoAMiningCapability <T>(this IFullNodeBuilder fullNodeBuilder) where T : BlockDefinition
        {
            fullNodeBuilder.ConfigureFeature(features =>
            {
                IFeatureRegistration feature = fullNodeBuilder.Features.FeatureRegistrations.FirstOrDefault(f => f.FeatureType == typeof(PoAFeature));
                feature.FeatureServices(services =>
                {
                    services.AddSingleton <IPoAMiner, PoAMiner>();
                    services.AddSingleton <MinerSettings>();
                    services.AddSingleton <BlockDefinition, T>();
                    services.AddSingleton <IBlockBufferGenerator, BlockBufferGenerator>();
                });
            });

            return(fullNodeBuilder);
        }
        /// <summary>
        /// Adds a feature to the node that will allow secertain services to be overridden.
        /// </summary>
        /// <param name="fullNodeBuilder">The object used to build the current node.</param>
        /// <param name="serviceToOverride">Callback routine that will override a given service.</param>
        /// <typeparam name="T">The feature that the service will be replaced in.</typeparam>
        /// <returns>The full node builder, enriched with the new component.</returns>
        public static IFullNodeBuilder OverrideService <T>(this IFullNodeBuilder fullNodeBuilder, Action <IServiceCollection> serviceToOverride)
        {
            fullNodeBuilder.ConfigureFeature(features =>
            {
                IFeatureRegistration feature = features.FeatureRegistrations.FirstOrDefault(f => f.FeatureType == typeof(T));
                if (feature != null)
                {
                    feature.FeatureServices(services =>
                    {
                        serviceToOverride(services);
                    });
                }
            });

            return(fullNodeBuilder);
        }
        /// <summary>
        /// Adds a feature to the node that will allow certain services to be overridden.
        /// </summary>
        /// <param name="fullNodeBuilder">The object used to build the current node.</param>
        /// <typeparam name="TFeature">The feature that the service should be added to.</typeparam>
        /// <typeparam name="T">The serice to add.</typeparam>
        /// <returns>The full node builder, enriched with the new component.</returns>
        public static IFullNodeBuilder AddService <TFeature, T>(this IFullNodeBuilder fullNodeBuilder)
        {
            fullNodeBuilder.ConfigureFeature(features =>
            {
                IFeatureRegistration feature = features.FeatureRegistrations.FirstOrDefault(f => f.FeatureType == typeof(TFeature));
                if (feature != null)
                {
                    feature.FeatureServices(services =>
                    {
                        services.AddSingleton(typeof(T));
                    });
                }
            });

            return(fullNodeBuilder);
        }
        /// <summary>
        /// Removes an implementation from a given feature.
        /// </summary>
        /// <param name="fullNodeBuilder">The object used to build the current node.</param>
        /// <typeparam name="T">The service to remove.</typeparam>
        /// <returns>The full node builder, with the service removed.</returns>
        public static IFullNodeBuilder RemoveImplementation <T>(this IFullNodeBuilder fullNodeBuilder)
        {
            fullNodeBuilder.ConfigureFeature(features =>
            {
                IFeatureRegistration feature = features.FeatureRegistrations.FirstOrDefault(f => f.FeatureType == typeof(BaseFeature));
                if (feature != null)
                {
                    feature.FeatureServices(services =>
                    {
                        ServiceDescriptor service = services.FirstOrDefault(s => s.ImplementationType == typeof(T));
                        if (service != null)
                        {
                            services.Remove(service);
                        }
                    });
                }
            });

            return(fullNodeBuilder);
        }
        /// <summary>
        /// Replaces a service in a given feature with another implementation.
        /// </summary>
        /// <param name="fullNodeBuilder">The object used to build the current node.</param>
        /// <param name="serviceToOverride">Callback routine that will override a given service.</param>
        /// <typeparam name="T">The services to be replaced.</typeparam>
        /// <typeparam name="TFeature">The feature that the service exists in.</typeparam>
        /// <returns>The full node builder, with the replaced service.</returns>
        public static IFullNodeBuilder ReplaceService <T, TFeature>(this IFullNodeBuilder fullNodeBuilder, T serviceToOverride)
        {
            fullNodeBuilder.ConfigureFeature(features =>
            {
                IFeatureRegistration feature = features.FeatureRegistrations.FirstOrDefault(f => f.FeatureType == typeof(TFeature));
                if (feature != null)
                {
                    feature.FeatureServices(services =>
                    {
                        ServiceDescriptor service = services.FirstOrDefault(s => s.ServiceType == typeof(T));
                        if (service != null)
                        {
                            services.Remove(service);
                            services.AddSingleton(typeof(T), serviceToOverride);
                        }
                    });
                }
            });

            return(fullNodeBuilder);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Substitute the <see cref="IDateTimeProvider"/> for a given feature.
        /// </summary>
        /// <typeparam name="T">The feature to substitute the provider for.</typeparam>
        public static IFullNodeBuilder OverrideDateTimeProviderFor <T>(this IFullNodeBuilder fullNodeBuilder)
        {
            fullNodeBuilder.ConfigureFeature(features =>
            {
                IFeatureRegistration feature = features.FeatureRegistrations.FirstOrDefault(f => f.FeatureType == typeof(T));
                if (feature != null)
                {
                    feature.FeatureServices(services =>
                    {
                        ServiceDescriptor service = services.FirstOrDefault(s => s.ServiceType == typeof(IDateTimeProvider));
                        if (service != null)
                        {
                            services.Remove(service);
                        }

                        services.AddSingleton <IDateTimeProvider, GenerateCoinsFastDateTimeProvider>();
                    });
                }
            });

            return(fullNodeBuilder);
        }