예제 #1
0
        internal static void AddDefaultServices(HostBuilderContext context, IServiceCollection services)
        {
            services.AddOptions();

            // Options logging
            services.TryAddSingleton(typeof(IOptionFormatter <>), typeof(DefaultOptionsFormatter <>));
            services.TryAddSingleton(typeof(IOptionFormatterResolver <>), typeof(DefaultOptionsFormatterResolver <>));

            // Register system services.
            services.TryAddSingleton <ILocalSiloDetails, LocalSiloDetails>();
            services.TryAddSingleton <ISiloHost, SiloWrapper>();
            services.TryAddTransient <ILifecycleSubject, LifecycleSubject>();
            services.TryAddSingleton <ISiloLifecycleSubject, SiloLifecycleSubject>();
            services.TryAddSingleton <ILifecycleParticipant <ISiloLifecycle>, SiloOptionsLogger>();
            services.PostConfigure <SiloMessagingOptions>(options =>
            {
                //
                // Assign environment specific defaults post configuration if user did not configured otherwise.
                //

                if (options.SiloSenderQueues == 0)
                {
                    options.SiloSenderQueues = Environment.ProcessorCount;
                }

                if (options.GatewaySenderQueues == 0)
                {
                    options.GatewaySenderQueues = Environment.ProcessorCount;
                }
            });
            services.TryAddSingleton <TelemetryManager>();
            services.TryAddFromExisting <ITelemetryProducer, TelemetryManager>();

            services.TryAddSingleton <IAppEnvironmentStatistics, AppEnvironmentStatistics>();
            services.TryAddSingleton <IHostEnvironmentStatistics, NoOpHostEnvironmentStatistics>();
            services.TryAddSingleton <OverloadDetector>();

            services.TryAddSingleton <ExecutorService>();
            // queue balancer contructing related
            services.TryAddTransient <IStreamQueueBalancer, ConsistentRingQueueBalancer>();
            services.TryAddSingleton <IStreamSubscriptionHandleFactory, StreamSubscriptionHandlerFactory>();

            services.TryAddSingleton <FallbackSystemTarget>();
            services.TryAddSingleton <LifecycleSchedulingSystemTarget>();

            services.AddLogging();
            services.TryAddSingleton <ITimerRegistry, TimerRegistry>();
            services.TryAddSingleton <IReminderRegistry, ReminderRegistry>();
            services.TryAddSingleton <GrainRuntime>();
            services.TryAddSingleton <IGrainRuntime, GrainRuntime>();
            services.TryAddSingleton <IGrainCancellationTokenRuntime, GrainCancellationTokenRuntime>();
            services.TryAddSingleton <OrleansTaskScheduler>();
            services.TryAddSingleton <GrainFactory>(sp => sp.GetService <InsideRuntimeClient>().ConcreteGrainFactory);
            services.TryAddFromExisting <IGrainFactory, GrainFactory>();
            services.TryAddFromExisting <IInternalGrainFactory, GrainFactory>();
            services.TryAddFromExisting <IGrainReferenceConverter, GrainFactory>();
            services.TryAddSingleton <IGrainReferenceRuntime, GrainReferenceRuntime>();
            services.TryAddSingleton <TypeMetadataCache>();
            services.TryAddSingleton <ActivationDirectory>();
            services.TryAddSingleton <ActivationCollector>();
            services.TryAddSingleton <LocalGrainDirectory>();
            services.TryAddFromExisting <ILocalGrainDirectory, LocalGrainDirectory>();
            services.TryAddSingleton(sp => sp.GetRequiredService <LocalGrainDirectory>().GsiActivationMaintainer);
            services.TryAddSingleton <SiloStatisticsManager>();
            services.TryAddSingleton <GrainTypeManager>();
            services.TryAddSingleton <MessageCenter>();
            services.TryAddFromExisting <IMessageCenter, MessageCenter>();
            services.TryAddFromExisting <ISiloMessageCenter, MessageCenter>();
            services.TryAddSingleton(FactoryUtility.Create <MessageCenter, Gateway>);
            services.TryAddSingleton <Dispatcher>(sp => sp.GetRequiredService <Catalog>().Dispatcher);
            services.TryAddSingleton <InsideRuntimeClient>();
            services.TryAddFromExisting <IRuntimeClient, InsideRuntimeClient>();
            services.TryAddFromExisting <ISiloRuntimeClient, InsideRuntimeClient>();
            services.AddFromExisting <ILifecycleParticipant <ISiloLifecycle>, InsideRuntimeClient>();

            services.TryAddSingleton <MultiClusterGossipChannelFactory>();
            services.TryAddSingleton <MultiClusterOracle>();
            services.TryAddSingleton <MultiClusterRegistrationStrategyManager>();
            services.TryAddFromExisting <IMultiClusterOracle, MultiClusterOracle>();
            services.TryAddSingleton <DeploymentLoadPublisher>();

            services.TryAddSingleton <MembershipOracle>();
            services.TryAddFromExisting <IMembershipOracle, MembershipOracle>();
            services.TryAddFromExisting <ISiloStatusOracle, MembershipOracle>();
            services.AddTransient <IConfigurationValidator, SiloClusteringValidator>();

            services.TryAddSingleton <ClientObserverRegistrar>();
            services.TryAddSingleton <SiloProviderRuntime>();
            services.TryAddFromExisting <IStreamProviderRuntime, SiloProviderRuntime>();
            services.TryAddFromExisting <IProviderRuntime, SiloProviderRuntime>();
            services.TryAddSingleton <ImplicitStreamSubscriberTable>();
            services.TryAddSingleton <MessageFactory>();

            services.TryAddSingleton <IGrainRegistrar <GlobalSingleInstanceRegistration>, GlobalSingleInstanceRegistrar>();
            services.TryAddSingleton <IGrainRegistrar <ClusterLocalRegistration>, ClusterLocalRegistrar>();
            services.TryAddSingleton <RegistrarManager>();
            services.TryAddSingleton <Factory <Grain, IMultiClusterRegistrationStrategy, ILogConsistencyProtocolServices> >(FactoryUtility.Create <Grain, IMultiClusterRegistrationStrategy, ProtocolServices>);
            services.TryAddSingleton(FactoryUtility.Create <GrainDirectoryPartition>);

            // Placement
            services.AddSingleton <IConfigurationValidator, ActivationCountBasedPlacementOptionsValidator>();
            services.TryAddSingleton <PlacementDirectorsManager>();
            services.TryAddSingleton <ClientObserversPlacementDirector>();

            // Configure the default placement strategy.
            services.TryAddSingleton <PlacementStrategy, RandomPlacement>();

            // Placement directors
            services.AddPlacementDirector <RandomPlacement, RandomPlacementDirector>();
            services.AddPlacementDirector <PreferLocalPlacement, PreferLocalPlacementDirector>();
            services.AddPlacementDirector <StatelessWorkerPlacement, StatelessWorkerDirector>();
            services.AddPlacementDirector <ActivationCountBasedPlacement, ActivationCountPlacementDirector>();
            services.AddPlacementDirector <HashBasedPlacement, HashBasedPlacementDirector>();

            // Activation selectors
            services.AddSingletonKeyedService <Type, IActivationSelector, RandomPlacementDirector>(typeof(RandomPlacement));
            services.AddSingletonKeyedService <Type, IActivationSelector, StatelessWorkerDirector>(typeof(StatelessWorkerPlacement));

            // Versioning
            services.TryAddSingleton <VersionSelectorManager>();
            services.TryAddSingleton <CachedVersionSelectorManager>();
            // Version selector strategy
            services.TryAddSingleton <GrainVersionStore>();
            services.AddFromExisting <IVersionStore, GrainVersionStore>();
            services.AddFromExisting <ILifecycleParticipant <ISiloLifecycle>, GrainVersionStore>();
            services.AddSingletonNamedService <VersionSelectorStrategy, AllCompatibleVersions>(nameof(AllCompatibleVersions));
            services.AddSingletonNamedService <VersionSelectorStrategy, LatestVersion>(nameof(LatestVersion));
            services.AddSingletonNamedService <VersionSelectorStrategy, MinimumVersion>(nameof(MinimumVersion));
            // Versions selectors
            services.AddSingletonKeyedService <Type, IVersionSelector, MinimumVersionSelector>(typeof(MinimumVersion));
            services.AddSingletonKeyedService <Type, IVersionSelector, LatestVersionSelector>(typeof(LatestVersion));
            services.AddSingletonKeyedService <Type, IVersionSelector, AllCompatibleVersionsSelector>(typeof(AllCompatibleVersions));

            // Compatibility
            services.TryAddSingleton <CompatibilityDirectorManager>();
            // Compatability strategy
            services.AddSingletonNamedService <CompatibilityStrategy, AllVersionsCompatible>(nameof(AllVersionsCompatible));
            services.AddSingletonNamedService <CompatibilityStrategy, BackwardCompatible>(nameof(BackwardCompatible));
            services.AddSingletonNamedService <CompatibilityStrategy, StrictVersionCompatible>(nameof(StrictVersionCompatible));
            // Compatability directors
            services.AddSingletonKeyedService <Type, ICompatibilityDirector, BackwardCompatilityDirector>(typeof(BackwardCompatible));
            services.AddSingletonKeyedService <Type, ICompatibilityDirector, AllVersionsCompatibilityDirector>(typeof(AllVersionsCompatible));
            services.AddSingletonKeyedService <Type, ICompatibilityDirector, StrictVersionCompatibilityDirector>(typeof(StrictVersionCompatible));

            services.TryAddSingleton <Factory <IGrainRuntime> >(sp => () => sp.GetRequiredService <IGrainRuntime>());

            // Grain activation
            services.TryAddSingleton <Catalog>();
            services.TryAddSingleton <GrainCreator>();
            services.TryAddSingleton <IGrainActivator, DefaultGrainActivator>();
            services.TryAddScoped <ActivationData.GrainActivationContextFactory>();
            services.TryAddScoped <IGrainActivationContext>(sp => sp.GetRequiredService <ActivationData.GrainActivationContextFactory>().Context);

            services.TryAddSingleton <IStreamSubscriptionManagerAdmin>(sp => new StreamSubscriptionManagerAdmin(sp.GetRequiredService <IStreamProviderRuntime>()));
            services.TryAddSingleton <IConsistentRingProvider>(
                sp =>
            {
                // TODO: make this not sux - jbragg
                var consistentRingOptions = sp.GetRequiredService <IOptions <ConsistentRingOptions> >().Value;
                var siloDetails           = sp.GetRequiredService <ILocalSiloDetails>();
                var loggerFactory         = sp.GetRequiredService <ILoggerFactory>();
                if (consistentRingOptions.UseVirtualBucketsConsistentRing)
                {
                    return(new VirtualBucketsRingProvider(siloDetails.SiloAddress, loggerFactory, consistentRingOptions.NumVirtualBucketsConsistentRing));
                }

                return(new ConsistentRingProvider(siloDetails.SiloAddress, loggerFactory));
            });

            services.TryAddSingleton(typeof(IKeyedServiceCollection <,>), typeof(KeyedServiceCollection <,>));

            // Serialization
            services.TryAddSingleton <SerializationManager>();
            services.TryAddSingleton <ITypeResolver, CachedTypeResolver>();
            services.TryAddSingleton <IFieldUtils, FieldUtils>();
            services.AddSingleton <BinaryFormatterSerializer>();
            services.AddSingleton <BinaryFormatterISerializableSerializer>();
            services.AddFromExisting <IKeyedSerializer, BinaryFormatterISerializableSerializer>();
            services.AddSingleton <ILBasedSerializer>();
            services.AddFromExisting <IKeyedSerializer, ILBasedSerializer>();

            // Transactions
            services.TryAddSingleton <ITransactionAgent, TransactionAgent>();
            services.TryAddSingleton <Factory <ITransactionAgent> >(sp => () => sp.GetRequiredService <ITransactionAgent>());
            services.TryAddSingleton <ITransactionManagerService, DisabledTransactionManagerService>();

            // Application Parts
            var applicationPartManager = context.GetApplicationPartManager();

            services.TryAddSingleton <IApplicationPartManager>(applicationPartManager);
            applicationPartManager.AddApplicationPart(new AssemblyPart(typeof(RuntimeVersion).Assembly)
            {
                IsFrameworkAssembly = true
            });
            applicationPartManager.AddApplicationPart(new AssemblyPart(typeof(Silo).Assembly)
            {
                IsFrameworkAssembly = true
            });
            applicationPartManager.AddFeatureProvider(new BuiltInTypesSerializationFeaturePopulator());
            applicationPartManager.AddFeatureProvider(new AssemblyAttributeFeatureProvider <GrainInterfaceFeature>());
            applicationPartManager.AddFeatureProvider(new AssemblyAttributeFeatureProvider <GrainClassFeature>());
            applicationPartManager.AddFeatureProvider(new AssemblyAttributeFeatureProvider <SerializerFeature>());
            services.AddTransient <IConfigurationValidator, ApplicationPartValidator>();

            //Add default option formatter if none is configured, for options which are required to be configured
            services.ConfigureFormatter <SiloOptions>();
            services.ConfigureFormatter <ProcessExitHandlingOptions>();
            services.ConfigureFormatter <SchedulingOptions>();
            services.ConfigureFormatter <PerformanceTuningOptions>();
            services.ConfigureFormatter <SerializationProviderOptions>();
            services.ConfigureFormatter <NetworkingOptions>();
            services.ConfigureFormatter <SiloMessagingOptions>();
            services.ConfigureFormatter <TypeManagementOptions>();
            services.ConfigureFormatter <ClusterMembershipOptions>();
            services.ConfigureFormatter <GrainDirectoryOptions>();
            services.ConfigureFormatter <ActivationCountBasedPlacementOptions>();
            services.ConfigureFormatter <GrainCollectionOptions>();
            services.ConfigureFormatter <GrainVersioningOptions>();
            services.ConfigureFormatter <ConsistentRingOptions>();
            services.ConfigureFormatter <MultiClusterOptions>();
            services.ConfigureFormatter <SiloStatisticsOptions>();
            services.ConfigureFormatter <TelemetryOptions>();
            services.ConfigureFormatter <LoadSheddingOptions>();
            services.ConfigureFormatter <EndpointOptions>();

            services.AddTransient <IConfigurationValidator, EndpointOptionsValidator>();
        }
예제 #2
0
        internal static void AddDefaultServices(HostBuilderContext context, IServiceCollection services)
        {
            services.AddOptions();

            // Register system services.
            services.TryAddSingleton <ISiloHost, SiloWrapper>();
            services.TryAddSingleton <SiloLifecycle>();

            services.PostConfigure <SiloMessagingOptions>(options =>
            {
                //
                // Assign environment specific defaults post configuration if user did not configured otherwise.
                //

                if (options.SiloSenderQueues == 0)
                {
                    options.SiloSenderQueues = Environment.ProcessorCount;
                }

                if (options.GatewaySenderQueues == 0)
                {
                    options.GatewaySenderQueues = Environment.ProcessorCount;
                }
            });
            services.TryAddSingleton <TelemetryManager>();
            services.TryAddFromExisting <ITelemetryProducer, TelemetryManager>();

            services.TryAddSingleton <ExecutorService>();
            // queue balancer contructing related
            services.TryAddTransient <StaticClusterConfigDeploymentBalancer>();
            services.TryAddTransient <DynamicClusterConfigDeploymentBalancer>();
            services.TryAddTransient <ClusterConfigDeploymentLeaseBasedBalancer>();
            services.TryAddTransient <ConsistentRingQueueBalancer>();
            services.TryAddTransient(typeof(IStreamSubscriptionObserver <>), typeof(StreamSubscriptionObserverProxy <>));

            services.TryAddSingleton <ProviderManagerSystemTarget>();
            services.TryAddSingleton <SiloUnobservedExceptionsHandler>();
            services.TryAddSingleton <StatisticsProviderManager>();
            services.AddFromExisting <IProviderManager, StatisticsProviderManager>();

            // storage providers
            services.TryAddSingleton <StorageProviderManager>();
            services.AddFromExisting <IProviderManager, StorageProviderManager>();
            services.TryAddFromExisting <IKeyedServiceCollection <string, IStorageProvider>, StorageProviderManager>();               // as named services
            services.TryAddSingleton <IStorageProvider>(sp => sp.GetRequiredService <StorageProviderManager>().GetDefaultProvider()); // default

            // log concistency providers
            services.TryAddSingleton <LogConsistencyProviderManager>();
            services.AddFromExisting <IProviderManager, LogConsistencyProviderManager>();
            services.TryAddFromExisting <IKeyedServiceCollection <string, ILogConsistencyProvider>, LogConsistencyProviderManager>();               // as named services
            services.TryAddSingleton <ILogConsistencyProvider>(sp => sp.GetRequiredService <LogConsistencyProviderManager>().GetDefaultProvider()); // default

            services.TryAddSingleton <BootstrapProviderManager>();
            services.AddFromExisting <IProviderManager, BootstrapProviderManager>();
            services.TryAddSingleton <LoadedProviderTypeLoaders>();
            services.AddLogging();
            //temporary change until runtime moved away from Logger
            services.TryAddSingleton(typeof(LoggerWrapper <>));
            services.TryAddSingleton <ITimerRegistry, TimerRegistry>();
            services.TryAddSingleton <IReminderRegistry, ReminderRegistry>();
            services.TryAddSingleton <StreamProviderManager>();
            services.AddFromExisting <IStreamProviderManager, StreamProviderManager>();
            services.TryAddFromExisting <IKeyedServiceCollection <string, IStreamProvider>, StreamProviderManager>(); // as named services
            services.AddFromExisting <IProviderManager, IStreamProviderManager>();
            services.TryAddSingleton <GrainRuntime>();
            services.TryAddSingleton <IGrainRuntime, GrainRuntime>();
            services.TryAddSingleton <IGrainCancellationTokenRuntime, GrainCancellationTokenRuntime>();
            services.TryAddSingleton <OrleansTaskScheduler>();
            services.TryAddSingleton <GrainFactory>(sp => sp.GetService <InsideRuntimeClient>().ConcreteGrainFactory);
            services.TryAddFromExisting <IGrainFactory, GrainFactory>();
            services.TryAddFromExisting <IInternalGrainFactory, GrainFactory>();
            services.TryAddFromExisting <IGrainReferenceConverter, GrainFactory>();
            services.TryAddSingleton <IGrainReferenceRuntime, GrainReferenceRuntime>();
            services.TryAddSingleton <TypeMetadataCache>();
            services.TryAddSingleton <ActivationDirectory>();
            services.TryAddSingleton <LocalGrainDirectory>();
            services.TryAddFromExisting <ILocalGrainDirectory, LocalGrainDirectory>();
            services.TryAddSingleton(sp => sp.GetRequiredService <LocalGrainDirectory>().GsiActivationMaintainer);
            services.TryAddSingleton <SiloStatisticsManager>();
            services.TryAddSingleton <ISiloPerformanceMetrics>(sp => sp.GetRequiredService <SiloStatisticsManager>().MetricsTable);
            services.TryAddFromExisting <ICorePerformanceMetrics, ISiloPerformanceMetrics>();
            services.TryAddSingleton <GrainTypeManager>();
            services.TryAddSingleton <MessageCenter>();
            services.TryAddFromExisting <IMessageCenter, MessageCenter>();
            services.TryAddFromExisting <ISiloMessageCenter, MessageCenter>();
            services.TryAddSingleton(FactoryUtility.Create <MessageCenter, Gateway>);
            services.TryAddSingleton <Dispatcher>(sp => sp.GetRequiredService <Catalog>().Dispatcher);
            services.TryAddSingleton <InsideRuntimeClient>();
            services.TryAddFromExisting <IRuntimeClient, InsideRuntimeClient>();
            services.TryAddFromExisting <ISiloRuntimeClient, InsideRuntimeClient>();
            services.TryAddFromExisting <ILifecycleParticipant <ISiloLifecycle>, InsideRuntimeClient>();
            services.TryAddSingleton <MultiClusterGossipChannelFactory>();
            services.TryAddSingleton <MultiClusterOracle>();
            services.TryAddSingleton <MultiClusterRegistrationStrategyManager>();
            services.TryAddFromExisting <IMultiClusterOracle, MultiClusterOracle>();
            services.TryAddSingleton <DeploymentLoadPublisher>();
            services.TryAddSingleton <MembershipOracle>();
            services.TryAddFromExisting <IMembershipOracle, MembershipOracle>();
            services.TryAddFromExisting <ISiloStatusOracle, MembershipOracle>();
            services.TryAddSingleton <MembershipTableFactory>();
            services.TryAddSingleton <ReminderTableFactory>();
            services.TryAddSingleton <IReminderTable>(sp => sp.GetRequiredService <ReminderTableFactory>().Create());
            services.TryAddSingleton <LocalReminderServiceFactory>();
            services.TryAddSingleton <ClientObserverRegistrar>();
            services.TryAddSingleton <SiloProviderRuntime>();
            services.TryAddFromExisting <IStreamProviderRuntime, SiloProviderRuntime>();
            services.TryAddFromExisting <IProviderRuntime, SiloProviderRuntime>();
            services.TryAddSingleton <ImplicitStreamSubscriberTable>();
            services.TryAddSingleton <MessageFactory>();

            services.TryAddSingleton <IGrainRegistrar <GlobalSingleInstanceRegistration>, GlobalSingleInstanceRegistrar>();
            services.TryAddSingleton <IGrainRegistrar <ClusterLocalRegistration>, ClusterLocalRegistrar>();
            services.TryAddSingleton <RegistrarManager>();
            services.TryAddSingleton <Factory <Grain, IMultiClusterRegistrationStrategy, ILogConsistencyProtocolServices> >(FactoryUtility.Create <Grain, IMultiClusterRegistrationStrategy, ProtocolServices>);
            services.TryAddSingleton(FactoryUtility.Create <GrainDirectoryPartition>);

            // Placement
            services.TryAddSingleton <PlacementDirectorsManager>();
            services.TryAddSingleton <IPlacementDirector <RandomPlacement>, RandomPlacementDirector>();
            services.TryAddSingleton <IActivationSelector <RandomPlacement>, RandomPlacementDirector>();
            services.TryAddSingleton <IPlacementDirector <PreferLocalPlacement>, PreferLocalPlacementDirector>();
            services.TryAddSingleton <IPlacementDirector <StatelessWorkerPlacement>, StatelessWorkerDirector>();
            services.TryAddSingleton <IActivationSelector <StatelessWorkerPlacement>, StatelessWorkerDirector>();
            services.TryAddSingleton <IPlacementDirector <ActivationCountBasedPlacement>, ActivationCountPlacementDirector>();
            services.TryAddSingleton <IPlacementDirector <HashBasedPlacement>, HashBasedPlacementDirector>();
            services.TryAddSingleton <DefaultPlacementStrategy>();
            services.TryAddSingleton <ClientObserversPlacementDirector>();

            // Versions
            services.TryAddSingleton <VersionSelectorManager>();
            services.TryAddSingleton <IVersionSelector <MinimumVersion>, MinimumVersionSelector>();
            services.TryAddSingleton <IVersionSelector <LatestVersion>, LatestVersionSelector>();
            services.TryAddSingleton <IVersionSelector <AllCompatibleVersions>, AllCompatibleVersionsSelector>();
            services.TryAddSingleton <CompatibilityDirectorManager>();
            services.TryAddSingleton <ICompatibilityDirector <BackwardCompatible>, BackwardCompatilityDirector>();
            services.TryAddSingleton <ICompatibilityDirector <AllVersionsCompatible>, AllVersionsCompatibilityDirector>();
            services.TryAddSingleton <ICompatibilityDirector <StrictVersionCompatible>, StrictVersionCompatibilityDirector>();
            services.TryAddSingleton <CachedVersionSelectorManager>();
            services.TryAddSingleton <IVersionStore, GrainVersionStore>();

            services.TryAddSingleton <Factory <IGrainRuntime> >(sp => () => sp.GetRequiredService <IGrainRuntime>());

            // Grain activation
            services.TryAddSingleton <Catalog>();
            services.TryAddSingleton <GrainCreator>();
            services.TryAddSingleton <IGrainActivator, DefaultGrainActivator>();
            services.TryAddScoped <ActivationData.GrainActivationContextFactory>();
            services.TryAddScoped <IGrainActivationContext>(sp => sp.GetRequiredService <ActivationData.GrainActivationContextFactory>().Context);

            services.TryAddSingleton <IStreamSubscriptionManagerAdmin>(sp => new StreamSubscriptionManagerAdmin(sp.GetRequiredService <IStreamProviderRuntime>()));
            services.TryAddSingleton <IConsistentRingProvider>(
                sp =>
            {
                var globalConfig  = sp.GetRequiredService <GlobalConfiguration>();
                var siloDetails   = sp.GetRequiredService <ILocalSiloDetails>();
                var loggerFactory = sp.GetRequiredService <ILoggerFactory>();
                if (globalConfig.UseVirtualBucketsConsistentRing)
                {
                    return(new VirtualBucketsRingProvider(siloDetails.SiloAddress, loggerFactory, globalConfig.NumVirtualBucketsConsistentRing));
                }

                return(new ConsistentRingProvider(siloDetails.SiloAddress, loggerFactory));
            });

            services.TryAddSingleton(typeof(IKeyedServiceCollection <,>), typeof(KeyedServiceCollection <,>));

            // Serialization
            services.TryAddSingleton <SerializationManager>();
            services.TryAddSingleton <ITypeResolver, CachedTypeResolver>();
            services.TryAddSingleton <IFieldUtils, FieldUtils>();

            // Transactions
            services.TryAddSingleton <ITransactionAgent, TransactionAgent>();
            services.TryAddSingleton <Factory <ITransactionAgent> >(sp => () => sp.GetRequiredService <ITransactionAgent>());
            services.TryAddSingleton <ITransactionManagerService, DisabledTransactionManagerService>();

            // Application Parts
            var applicationPartManager = context.GetApplicationPartManager();

            services.TryAddSingleton <ApplicationPartManager>(applicationPartManager);
            applicationPartManager.AddApplicationPart(new AssemblyPart(typeof(RuntimeVersion).Assembly)
            {
                IsFrameworkAssembly = true
            });
            applicationPartManager.AddApplicationPart(new AssemblyPart(typeof(Silo).Assembly)
            {
                IsFrameworkAssembly = true
            });
            applicationPartManager.AddFeatureProvider(new BuiltInTypesSerializationFeaturePopulator());
            applicationPartManager.AddFeatureProvider(new AssemblyAttributeFeatureProvider <GrainInterfaceFeature>());
            applicationPartManager.AddFeatureProvider(new AssemblyAttributeFeatureProvider <GrainClassFeature>());
            applicationPartManager.AddFeatureProvider(new AssemblyAttributeFeatureProvider <SerializerFeature>());
            services.TryAddTransient <IConfigurationValidator, ApplicationPartValidator>();
        }