Skip to content

Commit 7a86cf8

Browse files
authored
Scoped ModuleLoggerProvider.cs (#455)
* Scoped ModuleLoggerProvider.cs * Update Initialisation library * Fix * Fix * Fixes
1 parent e215a83 commit 7a86cf8

15 files changed

+118
-48
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
* Rework Dependency Injection Scopes (Singletons/Scoped services)
2-
* Fix bug where the Interactive Progress Bar Console view isn't rendering
2+
* Fix bug where the Interactive Progress Bar Console view was not rendering

src/ModularPipelines/DependencyInjection/DependencyInjectionSetup.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public static void Initialize(IServiceCollection services)
3838
// Everything that is injected into `PipelineContext` should be Scoped
3939
services
4040
.AddScoped<IPipelineContext, PipelineContext>()
41+
.AddScoped<IModuleLoggerProvider, ModuleLoggerProvider>()
4142
.AddScoped(typeof(ModuleLogger<>))
4243
.AddScoped<IHttp, Http.Http>()
4344
.AddScoped<ICommand, Command>()
@@ -65,7 +66,6 @@ public static void Initialize(IServiceCollection services)
6566

6667
// Singletons
6768
services
68-
.AddSingleton<IModuleLoggerProvider, ModuleLoggerProvider>()
6969
.AddSingleton<IConsolePrinter, ConsolePrinter>()
7070
.AddSingleton<IPipelineContextProvider, ModuleContextProvider>()
7171
.AddSingleton<IDependencyChainProvider, DependencyChainProvider>()

src/ModularPipelines/Engine/Executors/ExecutionOrchestrator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public async Task<PipelineSummary> ExecuteAsync(CancellationToken cancellationTo
5555
cancellationToken.Register(() => _engineCancellationToken.CancelWithReason("The user's cancellation token passed into the pipeline was cancelled."));
5656

5757
var organizedModules = await _pipelineInitializer.Initialize();
58-
58+
5959
var runnableModules = organizedModules.RunnableModules.Select(x => x.Module).ToList();
6060

6161
var start = DateTimeOffset.UtcNow;
@@ -89,7 +89,7 @@ private async Task<PipelineSummary> ExecutePipeline(List<ModuleBase> runnableMod
8989
// Dispose and flush on scope leave - So including success or if an exception is thrown
9090
await using var moduleDisposeExecutor = _moduleDisposeExecutor;
9191
using var printModuleOutputExecutor = _printModuleOutputExecutor;
92-
await using var printProgressExecutor = _printProgressExecutor;
92+
await using var printProgressExecutor = await _printProgressExecutor.InitializeAsync();
9393

9494
return await _pipelineExecutor.ExecuteAsync(runnableModules, organizedModules);
9595
}
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
namespace ModularPipelines.Engine.Executors;
22

3-
internal interface IPrintProgressExecutor : IAsyncDisposable;
3+
internal interface IPrintProgressExecutor : IAsyncDisposable
4+
{
5+
Task<IPrintProgressExecutor> InitializeAsync();
6+
}

src/ModularPipelines/Engine/Executors/PrintProgressExecutor.cs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
using System.Diagnostics;
2-
using Initialization.Microsoft.Extensions.DependencyInjection;
32
using Microsoft.Extensions.Logging;
43
using ModularPipelines.Helpers;
54

65
namespace ModularPipelines.Engine.Executors;
76

87
[StackTraceHidden]
9-
internal class PrintProgressExecutor : IPrintProgressExecutor, IInitializer
8+
internal class PrintProgressExecutor : IPrintProgressExecutor
109
{
1110
private readonly EngineCancellationToken _engineCancellationToken;
1211
private readonly IConsolePrinter _consolePrinter;
1312
private readonly IModuleRetriever _moduleRetriever;
1413
private readonly ILogger<PrintProgressExecutor> _logger;
1514

16-
private Task _printProgressTask = null!; // LateInit
17-
private CancellationTokenSource _printProgressCancellationTokenSource = null!; // LateInit
15+
private Task? _printProgressTask;
16+
private CancellationTokenSource? _printProgressCancellationTokenSource;
1817

1918
public PrintProgressExecutor(EngineCancellationToken engineCancellationToken,
2019
IConsolePrinter consolePrinter,
@@ -26,10 +25,8 @@ public PrintProgressExecutor(EngineCancellationToken engineCancellationToken,
2625
_moduleRetriever = moduleRetriever;
2726
_logger = logger;
2827
}
29-
30-
public int Order => int.MaxValue;
31-
32-
public async Task InitializeAsync()
28+
29+
public async Task<IPrintProgressExecutor> InitializeAsync()
3330
{
3431
_printProgressCancellationTokenSource =
3532
CancellationTokenSource.CreateLinkedTokenSource(_engineCancellationToken.Token);
@@ -38,11 +35,13 @@ public async Task InitializeAsync()
3835

3936
_printProgressTask =
4037
_consolePrinter.PrintProgress(organizedModules, _printProgressCancellationTokenSource.Token);
38+
39+
return this;
4140
}
4241

4342
public async ValueTask DisposeAsync()
4443
{
45-
_printProgressCancellationTokenSource.CancelAfter(5000);
44+
_printProgressCancellationTokenSource?.CancelAfter(5000);
4645

4746
await SafelyAwaitProgressPrinter();
4847
}
@@ -51,7 +50,10 @@ private async Task SafelyAwaitProgressPrinter()
5150
{
5251
try
5352
{
54-
await _printProgressTask;
53+
if (_printProgressTask != null)
54+
{
55+
await _printProgressTask;
56+
}
5557
}
5658
catch (Exception e)
5759
{

src/ModularPipelines/Engine/ModuleContextProvider.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
using Initialization.Microsoft.Extensions.DependencyInjection.Extensions;
22
using Microsoft.Extensions.DependencyInjection;
33
using ModularPipelines.Context;
4+
using ModularPipelines.Interfaces;
45

56
namespace ModularPipelines.Engine;
67

7-
internal class ModuleContextProvider : IPipelineContextProvider
8+
internal class ModuleContextProvider : IPipelineContextProvider, IScopeDisposer
89
{
910
private readonly IServiceProvider _serviceProvider;
11+
private readonly List<IServiceScope> _scopes = new();
1012

1113
public ModuleContextProvider(IServiceProvider serviceProvider)
1214
{
@@ -17,6 +19,13 @@ public IPipelineContext GetModuleContext()
1719
{
1820
var serviceScope = _serviceProvider.CreateAsyncScope();
1921

22+
_scopes.Add(serviceScope);
23+
2024
return serviceScope.ServiceProvider.GetRequiredService<IPipelineContext>();
2125
}
26+
27+
public IEnumerable<IServiceScope> GetScopes()
28+
{
29+
return _scopes;
30+
}
2231
}

src/ModularPipelines/Engine/PipelineFileWriter.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,19 @@
55

66
namespace ModularPipelines.Engine;
77

8-
internal class PipelineFileWriter : IPipelineFileWriter
8+
internal class PipelineFileWriter : IPipelineFileWriter, IScopeDisposer
99
{
1010
private readonly IServiceProvider _serviceProvider;
1111
private readonly IPipelineContextProvider _pipelineContextProvider;
1212
private readonly IEnumerable<IBuildSystemPipelineFileWriter> _writers;
13+
private readonly List<IServiceScope> _scopes = new();
1314

1415
public PipelineFileWriter(IServiceProvider serviceProvider, IPipelineContextProvider pipelineContextProvider)
1516
{
1617
_serviceProvider = serviceProvider;
1718
_pipelineContextProvider = pipelineContextProvider;
1819
var scope = serviceProvider.CreateScope();
20+
_scopes.Add(scope);
1921
_writers = scope.ServiceProvider.GetServices<IBuildSystemPipelineFileWriter>();
2022
}
2123

@@ -27,4 +29,9 @@ await _writers
2729
)
2830
.ProcessInParallel();
2931
}
32+
33+
public IEnumerable<IServiceScope> GetScopes()
34+
{
35+
return _scopes;
36+
}
3037
}

src/ModularPipelines/Engine/SafeModuleEstimatedTimeProvider.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
1+
using Microsoft.Extensions.DependencyInjection;
12
using Microsoft.Extensions.Logging;
3+
using ModularPipelines.Interfaces;
24
using ModularPipelines.Logging;
35
using ModularPipelines.Models;
46

57
namespace ModularPipelines.Engine;
68

7-
internal class SafeModuleEstimatedTimeProvider : ISafeModuleEstimatedTimeProvider
9+
internal class SafeModuleEstimatedTimeProvider : ISafeModuleEstimatedTimeProvider, IScopeDisposer
810
{
911
private readonly IModuleEstimatedTimeProvider _moduleEstimatedTimeProvider;
1012
private readonly ILogger _logger;
13+
private readonly List<IServiceScope> _scopes = new();
1114

12-
public SafeModuleEstimatedTimeProvider(IModuleEstimatedTimeProvider moduleEstimatedTimeProvider,
13-
IModuleLoggerProvider moduleLoggerProvider)
15+
public SafeModuleEstimatedTimeProvider(IModuleEstimatedTimeProvider moduleEstimatedTimeProvider, IServiceProvider serviceProvider)
1416
{
1517
_moduleEstimatedTimeProvider = moduleEstimatedTimeProvider;
16-
_logger = moduleLoggerProvider.GetLogger();
18+
var scope = serviceProvider.CreateScope();
19+
_scopes.Add(scope);
20+
_logger = scope.ServiceProvider.GetRequiredService<IModuleLoggerProvider>().GetLogger();
1721
}
1822

1923
public async Task<TimeSpan> GetModuleEstimatedTimeAsync(Type moduleType)
@@ -66,4 +70,9 @@ public async Task SaveSubModuleTimeAsync(Type moduleType, SubModuleEstimation su
6670
_logger.LogWarning(e, "Error saving submodule execution time for {Module}", moduleType.Name);
6771
}
6872
}
73+
74+
public IEnumerable<IServiceScope> GetScopes()
75+
{
76+
return _scopes;
77+
}
6978
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
3+
namespace ModularPipelines.Interfaces;
4+
5+
public interface IScopeDisposer : IDisposable
6+
{
7+
IEnumerable<IServiceScope> GetScopes();
8+
9+
void IDisposable.Dispose()
10+
{
11+
foreach (var serviceScope in GetScopes())
12+
{
13+
serviceScope.Dispose();
14+
}
15+
}
16+
}

src/ModularPipelines/Logging/IModuleLoggerContainer.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@ internal interface IModuleLoggerContainer
44
{
55
void PrintAllLoggers();
66

7+
IModuleLogger? GetLogger(Type type);
8+
79
void AddLogger(ModuleLogger logger);
810
}

0 commit comments

Comments
 (0)