From 1c54c1db77a1c8acbcec376e38da30ff9f748dd7 Mon Sep 17 00:00:00 2001 From: Amirul Ashraf Date: Fri, 27 Sep 2024 20:28:03 +0800 Subject: [PATCH] Well.. might as well make everything autofac --- .../Nethermind.Api/IApiWithBlockchain.cs | 5 +-- .../Nethermind.Api/IApiWithNetwork.cs | 4 +-- .../Nethermind.Api/IApiWithStores.cs | 5 +-- src/Nethermind/Nethermind.Api/IBasicApi.cs | 9 ++--- .../ServiceCollectionExtensionsTests.cs | 34 ++++-------------- ...sions.cs => ContainerBuilderExtensions.cs} | 36 +++++++------------ src/Nethermind/Nethermind.Db/IDbProvider.cs | 4 ++- .../Steps/InitializeNetwork.cs | 7 ++-- .../Nethermind.Merge.Plugin/MergePlugin.cs | 8 ++--- .../Nethermind.Optimism/OptimismPlugin.cs | 7 ++-- .../OldStyleFullSynchronizerTests.cs | 8 ++--- .../SyncThreadTests.cs | 8 ++--- .../SynchronizerTests.cs | 8 ++--- 13 files changed, 54 insertions(+), 89 deletions(-) rename src/Nethermind/Nethermind.Core/{IServiceCollectionExtensions.cs => ContainerBuilderExtensions.cs} (73%) diff --git a/src/Nethermind/Nethermind.Api/IApiWithBlockchain.cs b/src/Nethermind/Nethermind.Api/IApiWithBlockchain.cs index c255ad0c506..6fa5d248d00 100644 --- a/src/Nethermind/Nethermind.Api/IApiWithBlockchain.cs +++ b/src/Nethermind/Nethermind.Api/IApiWithBlockchain.cs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LGPL-3.0-only #nullable enable +using Autofac; using Microsoft.Extensions.DependencyInjection; using Nethermind.Blockchain; using Nethermind.Blockchain.Filters; @@ -101,9 +102,9 @@ public interface IApiWithBlockchain : IApiWithStores, IBlockchainBridgeFactory BackgroundTaskScheduler BackgroundTaskScheduler { get; set; } CensorshipDetector CensorshipDetector { get; set; } - public IServiceCollection CreateServiceCollectionFromApiWithBlockchain(IServiceCollection serviceCollection) + public ContainerBuilder CreateServiceCollectionFromApiWithBlockchain(ContainerBuilder builder) { - return CreateServiceCollectionFromApiWithStores(serviceCollection) + return CreateServiceCollectionFromApiWithStores(builder) .AddPropertiesFrom(this) .AddSingleton(NodeStorageFactory.WrapKeyValueStore(DbProvider!.StateDb)); diff --git a/src/Nethermind/Nethermind.Api/IApiWithNetwork.cs b/src/Nethermind/Nethermind.Api/IApiWithNetwork.cs index 2c2d5e1f129..771e242a2e2 100644 --- a/src/Nethermind/Nethermind.Api/IApiWithNetwork.cs +++ b/src/Nethermind/Nethermind.Api/IApiWithNetwork.cs @@ -57,9 +57,9 @@ public interface IApiWithNetwork : IApiWithBlockchain IContainer? ApiWithNetworkServiceContainer { get; set; } - public IServiceCollection CreateServiceCollectionFromApiWithNetwork(IServiceCollection serviceCollection) + public ContainerBuilder CreateServiceCollectionFromApiWithNetwork(ContainerBuilder builder) { - return CreateServiceCollectionFromApiWithBlockchain(serviceCollection) + return CreateServiceCollectionFromApiWithBlockchain(builder) .AddPropertiesFrom(this); } } diff --git a/src/Nethermind/Nethermind.Api/IApiWithStores.cs b/src/Nethermind/Nethermind.Api/IApiWithStores.cs index 950dcd34d47..8e63cdac496 100644 --- a/src/Nethermind/Nethermind.Api/IApiWithStores.cs +++ b/src/Nethermind/Nethermind.Api/IApiWithStores.cs @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited // SPDX-License-Identifier: LGPL-3.0-only +using Autofac; using Microsoft.Extensions.DependencyInjection; using Nethermind.Blockchain; using Nethermind.Blockchain.Blocks; @@ -32,9 +33,9 @@ public interface IApiWithStores : IBasicApi IWallet? Wallet { get; set; } IBlockStore? BadBlocksStore { get; set; } - public IServiceCollection CreateServiceCollectionFromApiWithStores(IServiceCollection serviceCollection) + public ContainerBuilder CreateServiceCollectionFromApiWithStores(ContainerBuilder builder) { - return CreateServiceCollectionFromBasicApi(serviceCollection) + return CreateServiceCollectionFromBasicApi(builder) .AddPropertiesFrom(this); } } diff --git a/src/Nethermind/Nethermind.Api/IBasicApi.cs b/src/Nethermind/Nethermind.Api/IBasicApi.cs index a4762835981..131660307ad 100644 --- a/src/Nethermind/Nethermind.Api/IBasicApi.cs +++ b/src/Nethermind/Nethermind.Api/IBasicApi.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.IO.Abstractions; using System.Linq; +using Autofac; using Microsoft.Extensions.DependencyInjection; using Nethermind.Abi; using Nethermind.Api.Extensions; @@ -60,15 +61,15 @@ public IEnumerable GetConsensusWrapperPlugins() => public IEnumerable GetSynchronizationPlugins() => Plugins.OfType(); - public IServiceCollection CreateServiceCollectionFromBasicApi(IServiceCollection serviceCollection) + public ContainerBuilder CreateServiceCollectionFromBasicApi(ContainerBuilder builder) { - IServiceCollection sc = serviceCollection + builder .AddPropertiesFrom(this) .AddSingleton(ConfigProvider.GetConfig()); - DbProvider!.ConfigureServiceCollection(sc); + DbProvider!.ConfigureServiceCollection(builder); - return sc; + return builder; } } } diff --git a/src/Nethermind/Nethermind.Core.Test/ServiceCollectionExtensionsTests.cs b/src/Nethermind/Nethermind.Core.Test/ServiceCollectionExtensionsTests.cs index 74901dd3254..3bf75f3bb68 100644 --- a/src/Nethermind/Nethermind.Core.Test/ServiceCollectionExtensionsTests.cs +++ b/src/Nethermind/Nethermind.Core.Test/ServiceCollectionExtensionsTests.cs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LGPL-3.0-only using System; +using Autofac; using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; @@ -14,35 +15,14 @@ public class ServiceCollectionExtensionsTests public void AddPropertiesFrom_CanAddProperties() { ITestInterface interfaceImplementation = new InterfaceImplementation(); - IServiceProvider sp = new ServiceCollection() + IContainer sp = new ContainerBuilder() .AddPropertiesFrom(interfaceImplementation) - .BuildServiceProvider(); + .Build(); - sp.GetService().Should().NotBeNull(); - sp.GetService().Should().BeNull(); - sp.GetService().Should().BeNull(); - sp.GetService().Should().BeNull(); - } - - [Test] - public void TestForwardDependency_ShouldNotDispose() - { - ServiceProvider sp1 = new ServiceCollection() - .AddSingleton() - .BuildServiceProvider(); - - ServiceProvider sp2 = new ServiceCollection() - .ForwardServiceAsSingleton(sp1) - .BuildServiceProvider(); - - DisposableService disposableService = sp2.GetRequiredService(); - disposableService.WasDisposed.Should().BeFalse(); - - sp2.Dispose(); - disposableService.WasDisposed.Should().BeFalse(); - - sp1.Dispose(); - disposableService.WasDisposed.Should().BeTrue(); + sp.Resolve().Should().NotBeNull(); + sp.Resolve().Should().BeNull(); + sp.Resolve().Should().BeNull(); + sp.Resolve().Should().BeNull(); } private class InterfaceImplementation : ITestInterface diff --git a/src/Nethermind/Nethermind.Core/IServiceCollectionExtensions.cs b/src/Nethermind/Nethermind.Core/ContainerBuilderExtensions.cs similarity index 73% rename from src/Nethermind/Nethermind.Core/IServiceCollectionExtensions.cs rename to src/Nethermind/Nethermind.Core/ContainerBuilderExtensions.cs index d68a0fe41ca..207e024fc08 100644 --- a/src/Nethermind/Nethermind.Core/IServiceCollectionExtensions.cs +++ b/src/Nethermind/Nethermind.Core/ContainerBuilderExtensions.cs @@ -7,32 +7,11 @@ using System.Reflection; using Autofac; using Autofac.Features.AttributeFilters; -using Microsoft.Extensions.DependencyInjection; namespace Nethermind.Core; -public static class IServiceCollectionExtensions +public static class ContainerBuilderExtensions { - public static IServiceCollection ForwardServiceAsSingleton(this IServiceCollection configuration, IServiceProvider baseServiceProvider) where T : class - { - T? theService = baseServiceProvider.GetService(); - if (theService != null) - { - configuration.AddSingleton(baseServiceProvider.GetRequiredService()); - } - else - { - // It could be that this is in a test where the service was not registered and any dependency will be - // replaced anyway. While using a factory function like this seems like it would have the same behaviour - // as getting it directly first, it has one critical difference. When the final IServiceProvider is - // disposed, it would also call the Dispose function of the service as it assume that it created and - // therefore owned the service. - configuration.AddSingleton((sp) => baseServiceProvider.GetRequiredService()); - } - - return configuration; - } - /// /// Add all properties as singleton. It get them ahead of time instead of lazily to prevent the final service provider /// from disposing it. To prevent a property from being included, use . @@ -41,7 +20,7 @@ public static IServiceCollection ForwardServiceAsSingleton(this IServiceColle /// /// /// - public static IServiceCollection AddPropertiesFrom(this IServiceCollection configuration, T source) where T : class + public static ContainerBuilder AddPropertiesFrom(this ContainerBuilder configuration, T source) where T : class { Type t = typeof(T); @@ -54,7 +33,7 @@ public static IServiceCollection AddPropertiesFrom(this IServiceCollection co object? val = propertyInfo.GetValue(source); if (val != null) { - configuration = configuration.AddSingleton(propertyInfo.PropertyType, val); + configuration.RegisterInstance(val).As(propertyInfo.PropertyType); } } @@ -91,6 +70,15 @@ public static ContainerBuilder AddSingleton(this ContainerBuilder buil return builder; } + public static ContainerBuilder AddKeyedSingleton(this ContainerBuilder builder, string key, T instance) where T : class + { + builder.RegisterInstance(instance) + .Named(key) + .SingleInstance(); + + return builder; + } + public static ContainerBuilder AddScoped(this ContainerBuilder builder) where T : notnull { builder.RegisterType() diff --git a/src/Nethermind/Nethermind.Db/IDbProvider.cs b/src/Nethermind/Nethermind.Db/IDbProvider.cs index 4faf741ead6..5c6c4b7fa50 100644 --- a/src/Nethermind/Nethermind.Db/IDbProvider.cs +++ b/src/Nethermind/Nethermind.Db/IDbProvider.cs @@ -3,7 +3,9 @@ using System; using System.Collections.Generic; +using Autofac; using Microsoft.Extensions.DependencyInjection; +using Nethermind.Core; namespace Nethermind.Db { @@ -32,7 +34,7 @@ public interface IDbProvider : IDisposable void RegisterColumnDb(string dbName, IColumnsDb db); IEnumerable> GetAllDbMeta(); - void ConfigureServiceCollection(IServiceCollection sc) + void ConfigureServiceCollection(ContainerBuilder sc) { sc.AddSingleton(this); diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs b/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs index 5605223d2d7..783c7f3b086 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs @@ -130,16 +130,15 @@ private async Task Initialize(CancellationToken cancellationToken) if (_api.Synchronizer is null) { - IServiceCollection serviceCollection = _api.CreateServiceCollectionFromApiWithNetwork(new ServiceCollection()) - .AddSingleton(No.BeaconSync); - if (_api.ChainSpec.SealEngineType == SealEngineType.Clique) _syncConfig.NeedToWaitForHeader = true; // Should this be in chainspec itself? ContainerBuilder builder = new ContainerBuilder(); - builder.Populate(serviceCollection); + _api.CreateServiceCollectionFromApiWithNetwork(builder) + .AddSingleton(No.BeaconSync); Synchronizer.ConfigureContainerBuilder(builder, _syncConfig); IContainer container = builder.Build(); + _api.ApiWithNetworkServiceContainer = container; _api.DisposeStack.Append(container); } diff --git a/src/Nethermind/Nethermind.Merge.Plugin/MergePlugin.cs b/src/Nethermind/Nethermind.Merge.Plugin/MergePlugin.cs index 8bc0ddb80dc..c8ab4d71c10 100644 --- a/src/Nethermind/Nethermind.Merge.Plugin/MergePlugin.cs +++ b/src/Nethermind/Nethermind.Merge.Plugin/MergePlugin.cs @@ -440,16 +440,16 @@ public Task InitSynchronization() _api.Pivot = _beaconPivot; - IServiceCollection serviceCollection = _api.CreateServiceCollectionFromApiWithNetwork(new ServiceCollection()) + ContainerBuilder builder = new ContainerBuilder(); + + _api.CreateServiceCollectionFromApiWithNetwork(builder) .AddSingleton(_beaconSync) .AddSingleton(_beaconPivot) .AddSingleton(_mergeConfig) .AddSingleton(_invalidChainTracker); - - ContainerBuilder builder = new ContainerBuilder(); - builder.Populate(serviceCollection); Synchronizer.ConfigureContainerBuilder(builder, _syncConfig); MergeSynchronizer.ConfigureMergeComponent(builder); + IContainer container = builder.Build(); _api.ApiWithNetworkServiceContainer = container; _api.DisposeStack.Append(container); diff --git a/src/Nethermind/Nethermind.Optimism/OptimismPlugin.cs b/src/Nethermind/Nethermind.Optimism/OptimismPlugin.cs index 6897d923ea6..411cd068a03 100644 --- a/src/Nethermind/Nethermind.Optimism/OptimismPlugin.cs +++ b/src/Nethermind/Nethermind.Optimism/OptimismPlugin.cs @@ -152,18 +152,17 @@ public Task InitSynchronization() _api.BetterPeerStrategy = new MergeBetterPeerStrategy(null!, _api.PoSSwitcher, _beaconPivot, _api.LogManager); _api.Pivot = _beaconPivot; - IServiceCollection serviceCollection = ((INethermindApi)_api).CreateServiceCollectionFromApiWithNetwork(new ServiceCollection()) + ContainerBuilder builder = new ContainerBuilder(); + ((INethermindApi)_api).CreateServiceCollectionFromApiWithNetwork(builder) .AddSingleton(_beaconSync) .AddSingleton(_beaconPivot) .AddSingleton(_api.PoSSwitcher) .AddSingleton(_mergeConfig) .AddSingleton(_invalidChainTracker); - - ContainerBuilder builder = new ContainerBuilder(); - builder.Populate(serviceCollection); Synchronizer.ConfigureContainerBuilder(builder, _syncConfig); MergeSynchronizer.ConfigureMergeComponent(builder); IContainer container = builder.Build(); + _api.ApiWithNetworkServiceContainer = container; _api.DisposeStack.Append(container); diff --git a/src/Nethermind/Nethermind.Synchronization.Test/OldStyleFullSynchronizerTests.cs b/src/Nethermind/Nethermind.Synchronization.Test/OldStyleFullSynchronizerTests.cs index 800a1233755..70e958b6c53 100644 --- a/src/Nethermind/Nethermind.Synchronization.Test/OldStyleFullSynchronizerTests.cs +++ b/src/Nethermind/Nethermind.Synchronization.Test/OldStyleFullSynchronizerTests.cs @@ -69,7 +69,7 @@ public async Task Setup() IStateReader stateReader = new StateReader(trieStore, _codeDb, LimboLogs.Instance); - IServiceCollection serviceCollection = new ServiceCollection() + ContainerBuilder builder = new ContainerBuilder() .AddSingleton(nodeStorage) .AddSingleton(MainnetSpecProvider.Instance) .AddSingleton(_blockTree) @@ -86,11 +86,9 @@ public async Task Setup() .AddSingleton(stateReader) .AddSingleton(No.BeaconSync) .AddSingleton(LimboLogs.Instance); - dbProvider.ConfigureServiceCollection(serviceCollection); - - ContainerBuilder builder = new ContainerBuilder(); - builder.Populate(serviceCollection); + dbProvider.ConfigureServiceCollection(builder); Synchronizer.ConfigureContainerBuilder(builder, syncConfig); + IContainer container = builder.Build(); _synchronizer = container.Resolve(); diff --git a/src/Nethermind/Nethermind.Synchronization.Test/SyncThreadTests.cs b/src/Nethermind/Nethermind.Synchronization.Test/SyncThreadTests.cs index 0d3da39a02b..f6fac1169d0 100644 --- a/src/Nethermind/Nethermind.Synchronization.Test/SyncThreadTests.cs +++ b/src/Nethermind/Nethermind.Synchronization.Test/SyncThreadTests.cs @@ -361,7 +361,8 @@ private SyncTestContext CreateSyncManager(int index) TotalDifficultyBetterPeerStrategy bestPeerStrategy = new(LimboLogs.Instance); Pivot pivot = new(syncConfig); - IServiceCollection serviceCollection = new ServiceCollection() + ContainerBuilder builder = new ContainerBuilder(); + builder .AddSingleton(dbProvider) .AddSingleton(new NodeStorage(dbProvider.StateDb)) .AddSingleton(MainnetSpecProvider.Instance) @@ -380,10 +381,7 @@ private SyncTestContext CreateSyncManager(int index) .AddSingleton(receiptStorage) .AddSingleton(No.BeaconSync) .AddSingleton(logManager); - dbProvider.ConfigureServiceCollection(serviceCollection); - - ContainerBuilder builder = new ContainerBuilder(); - builder.Populate(serviceCollection); + dbProvider.ConfigureServiceCollection(builder); Synchronizer.ConfigureContainerBuilder(builder, syncConfig); IContainer container = builder.Build(); diff --git a/src/Nethermind/Nethermind.Synchronization.Test/SynchronizerTests.cs b/src/Nethermind/Nethermind.Synchronization.Test/SynchronizerTests.cs index c2e1927ac1b..753d0dc9e5f 100644 --- a/src/Nethermind/Nethermind.Synchronization.Test/SynchronizerTests.cs +++ b/src/Nethermind/Nethermind.Synchronization.Test/SynchronizerTests.cs @@ -344,10 +344,10 @@ ISyncConfig GetSyncConfig() => IInvalidChainTracker invalidChainTracker = new NoopInvalidChainTracker(); - IServiceCollection serviceCollection = new ServiceCollection(); - dbProvider.ConfigureServiceCollection(serviceCollection); + ContainerBuilder builder = new ContainerBuilder(); + dbProvider.ConfigureServiceCollection(builder); - serviceCollection + builder .AddSingleton(dbProvider) .AddSingleton(nodeStorage) .AddSingleton(MainnetSpecProvider.Instance) @@ -370,8 +370,6 @@ ISyncConfig GetSyncConfig() => .AddSingleton(beaconPivot) .AddSingleton(_logManager); - ContainerBuilder builder = new ContainerBuilder(); - builder.Populate(serviceCollection); Nethermind.Synchronization.Synchronizer.ConfigureContainerBuilder(builder, syncConfig); if (IsMerge(synchronizerType))