From 7ff01696190c6ce797bf57d17c6ca92c2c34d5de Mon Sep 17 00:00:00 2001 From: Joshua Hegedus Date: Tue, 7 Nov 2023 00:20:24 +0100 Subject: [PATCH] fixed module implementation with interface segregation --- .../Logger/Commands/ClearLogCommand.cs | 2 +- .../Logger/Commands/LogCommand.cs | 4 +- _src/Implementation/Module/AModule.cs | 45 +++++++++++++++++++ _src/Implementation/Module/CoreModule.cs | 28 +++++++----- .../Factories/NavigatorElementFactory.cs | 2 +- .../Factories/JsonRepositoryFactory.cs | 2 +- _src/Implementation/Time/DefaultStopwatch.cs | 3 +- .../Time/Factories/StopwatchFactory.cs | 1 - _src/Infrastructure/Module/IBaseModule.cs | 18 ++++++++ _src/Infrastructure/Module/IGeneralModule.cs | 3 +- _src/Infrastructure/Module/IModule.cs | 10 ++++- _src/_Tests/ImplementationTest/ReaderTests.cs | 3 +- .../ImplementationTest/Time/StopwatchTests.cs | 2 +- _src/_Tests/ManualTests/Core.cs | 3 +- _src/_Tests/ManualTests/Dump.cs | 1 - 15 files changed, 100 insertions(+), 27 deletions(-) create mode 100644 _src/Implementation/Module/AModule.cs create mode 100644 _src/Infrastructure/Module/IBaseModule.cs diff --git a/_src/Implementation/Logger/Commands/ClearLogCommand.cs b/_src/Implementation/Logger/Commands/ClearLogCommand.cs index 3e154d6..79a97ca 100644 --- a/_src/Implementation/Logger/Commands/ClearLogCommand.cs +++ b/_src/Implementation/Logger/Commands/ClearLogCommand.cs @@ -5,7 +5,7 @@ namespace Implementation.Logger.Commands { - public class ClearLogCommand : ICommand + internal class ClearLogCommand : ICommand { private readonly string _path; diff --git a/_src/Implementation/Logger/Commands/LogCommand.cs b/_src/Implementation/Logger/Commands/LogCommand.cs index cf51ae3..bac0c93 100644 --- a/_src/Implementation/Logger/Commands/LogCommand.cs +++ b/_src/Implementation/Logger/Commands/LogCommand.cs @@ -6,7 +6,7 @@ namespace Implementation.Logger.Commands { - public class LogCommand : ICommand + internal class LogCommand : ICommand { private readonly string _filePath; private readonly string _content; @@ -29,7 +29,7 @@ public async Task Execute() throw new FileNotFoundException("Log file does not exists!"); } - using (var streamWriter = new StreamWriter(_filePath, true, Encoding.ASCII)) + await using (var streamWriter = new StreamWriter(_filePath, true, Encoding.ASCII)) { await streamWriter.WriteAsync(_content); } diff --git a/_src/Implementation/Module/AModule.cs b/_src/Implementation/Module/AModule.cs new file mode 100644 index 0000000..c1a4f68 --- /dev/null +++ b/_src/Implementation/Module/AModule.cs @@ -0,0 +1,45 @@ +using System; +using Infrastructure.Module; +using Microsoft.Extensions.DependencyInjection; + +namespace Implementation.Module +{ + /// + public abstract class AModule : IModule + { + protected IServiceCollection Collection; + + /// + public bool IsRegistered { get; } = false; + + protected AModule(IServiceCollection collection) + { + Collection = collection ?? throw new ArgumentNullException(nameof(collection)); + } + + public virtual IServiceCollection RegisterServices() + { + if (IsRegistered) + { + return Collection; + } + + RegisterServices(Collection); + + return Collection; + } + + public abstract IModule RegisterServices(IServiceCollection collection); + + public virtual IModule RegisterOtherServices(IBaseModule module) + { + if (module.IsRegistered) + { + return this; + } + + module.RegisterServices(Collection); + return this; + } + } +} diff --git a/_src/Implementation/Module/CoreModule.cs b/_src/Implementation/Module/CoreModule.cs index 08c11ae..4f7ac66 100644 --- a/_src/Implementation/Module/CoreModule.cs +++ b/_src/Implementation/Module/CoreModule.cs @@ -6,6 +6,7 @@ using Implementation.IO; using Implementation.Navigator.Factories; using Implementation.Repositories.Factories; +using Implementation.Time; using Implementation.Time.Factories; using Infrastructure.Application; using Infrastructure.Configuration.Factories; @@ -20,20 +21,28 @@ namespace Implementation.Module { - public class CoreModule : IGeneralModule, ICancellableModule + public class CoreModule : AModule, IGeneralModule, ICancellableModule { public CancellationTokenSource Source { get; } - public CoreModule() + public CoreModule(IServiceCollection serviceCollection, CancellationTokenSource source) : base(serviceCollection) { - + Source = source ?? throw new ArgumentNullException(nameof(source)); } - public void RegisterServices(IServiceCollection collection, string projectNamespace) + public void RegisterServices(string projectNamespace) { - var tokenSource = new CancellationTokenSource(); var mainFolder = Path.Join("joshika39", projectNamespace); var userFolder = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), mainFolder); + Collection.AddTransient(provider => + new GeneralApplicationSettings(userFolder, provider.GetRequiredService()) + ); + + RegisterServices(); + } + + public override IModule RegisterServices(IServiceCollection collection) + { collection.AddScoped(_ => new Logger.Logger(Guid.NewGuid())); collection.AddTransient(); collection.AddTransient(); @@ -43,13 +52,10 @@ public void RegisterServices(IServiceCollection collection, string projectNamesp collection.AddScoped(); collection.AddTransient(); - collection.AddScoped(_ => new LifeCycleManager(tokenSource)); + collection.AddScoped(_ => new LifeCycleManager(Source)); collection.AddSingleton(); - collection.AddScoped(_ => new DefaultStopwatch(tokenSource.Token)); - - collection.AddTransient(provider => - new GeneralApplicationSettings(userFolder, provider.GetRequiredService()) - ); + collection.AddScoped(_ => new DefaultStopwatch(Source.Token)); + return this; } } } diff --git a/_src/Implementation/Navigator/Factories/NavigatorElementFactory.cs b/_src/Implementation/Navigator/Factories/NavigatorElementFactory.cs index 6ef1fac..7c0d440 100644 --- a/_src/Implementation/Navigator/Factories/NavigatorElementFactory.cs +++ b/_src/Implementation/Navigator/Factories/NavigatorElementFactory.cs @@ -4,7 +4,7 @@ namespace Implementation.Navigator.Factories { - public class NavigatorElementFactory : INavigatorElementFactory + internal class NavigatorElementFactory : INavigatorElementFactory { public INavigatorElement CreateNavigatorElement(string displayText, T value) diff --git a/_src/Implementation/Repositories/Factories/JsonRepositoryFactory.cs b/_src/Implementation/Repositories/Factories/JsonRepositoryFactory.cs index 8c07a36..cf9baa5 100644 --- a/_src/Implementation/Repositories/Factories/JsonRepositoryFactory.cs +++ b/_src/Implementation/Repositories/Factories/JsonRepositoryFactory.cs @@ -5,7 +5,7 @@ namespace Implementation.Repositories.Factories { - public class RepositoryFactory : IRepositoryFactory + internal class RepositoryFactory : IRepositoryFactory { private readonly IApplicationSettings _applicationSettings; diff --git a/_src/Implementation/Time/DefaultStopwatch.cs b/_src/Implementation/Time/DefaultStopwatch.cs index 379a886..eaacf7e 100644 --- a/_src/Implementation/Time/DefaultStopwatch.cs +++ b/_src/Implementation/Time/DefaultStopwatch.cs @@ -4,11 +4,10 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; -using Implementation.Time; using Infrastructure.Time; using Infrastructure.Time.Listeners; -namespace GameFramework.Impl.Time +namespace Implementation.Time { internal sealed class DefaultStopwatch : IStopwatch { diff --git a/_src/Implementation/Time/Factories/StopwatchFactory.cs b/_src/Implementation/Time/Factories/StopwatchFactory.cs index 10c565b..8f123f9 100644 --- a/_src/Implementation/Time/Factories/StopwatchFactory.cs +++ b/_src/Implementation/Time/Factories/StopwatchFactory.cs @@ -1,5 +1,4 @@ using System.Threading; -using GameFramework.Impl.Time; using Infrastructure.Time; using Infrastructure.Time.Factories; diff --git a/_src/Infrastructure/Module/IBaseModule.cs b/_src/Infrastructure/Module/IBaseModule.cs new file mode 100644 index 0000000..dbb0b0c --- /dev/null +++ b/_src/Infrastructure/Module/IBaseModule.cs @@ -0,0 +1,18 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace Infrastructure.Module +{ + public interface IBaseModule + { + /// + /// Shows whether the modules is already registered or not. + /// + bool IsRegistered { get; } + + /// + /// Registers the services into the specified collection. + /// + /// The created in the composition root. + IModule RegisterServices(IServiceCollection collection); + } +} diff --git a/_src/Infrastructure/Module/IGeneralModule.cs b/_src/Infrastructure/Module/IGeneralModule.cs index 50f4f98..9f23898 100644 --- a/_src/Infrastructure/Module/IGeneralModule.cs +++ b/_src/Infrastructure/Module/IGeneralModule.cs @@ -10,8 +10,7 @@ public interface IGeneralModule /// /// Registers the services. /// - /// The created in the composition root. /// The name of the project which uses this module - void RegisterServices(IServiceCollection collection, string projectNamespace); + void RegisterServices(string projectNamespace); } } diff --git a/_src/Infrastructure/Module/IModule.cs b/_src/Infrastructure/Module/IModule.cs index e07cdb7..5d7960f 100644 --- a/_src/Infrastructure/Module/IModule.cs +++ b/_src/Infrastructure/Module/IModule.cs @@ -10,7 +10,13 @@ public interface IModule /// /// Registers the services. /// - /// The created in the composition root. - void RegisterServices(IServiceCollection collection); + /// Returns self after registered the services + IServiceCollection RegisterServices(); + + /// + /// Registers the services of a different module. + /// + /// Other module + IModule RegisterOtherServices(IBaseModule module); } } diff --git a/_src/_Tests/ImplementationTest/ReaderTests.cs b/_src/_Tests/ImplementationTest/ReaderTests.cs index 4409756..25ebc65 100644 --- a/_src/_Tests/ImplementationTest/ReaderTests.cs +++ b/_src/_Tests/ImplementationTest/ReaderTests.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading; using Implementation.IO; using Implementation.Module; using Infrastructure.IO; @@ -17,7 +18,7 @@ public class ReaderTests public ReaderTests() { var collection = new ServiceCollection(); - new CoreModule().RegisterServices(collection, "reader-tests"); + new CoreModule(collection, new CancellationTokenSource()).RegisterServices("reader-tests"); _provider = collection.BuildServiceProvider(); } diff --git a/_src/_Tests/ImplementationTest/Time/StopwatchTests.cs b/_src/_Tests/ImplementationTest/Time/StopwatchTests.cs index 667ce85..292a689 100644 --- a/_src/_Tests/ImplementationTest/Time/StopwatchTests.cs +++ b/_src/_Tests/ImplementationTest/Time/StopwatchTests.cs @@ -1,6 +1,6 @@ using System.Threading; using System.Threading.Tasks; -using GameFramework.Impl.Time; +using Implementation.Time; using Infrastructure.Time; using Infrastructure.Time.Listeners; using Moq; diff --git a/_src/_Tests/ManualTests/Core.cs b/_src/_Tests/ManualTests/Core.cs index 1efddd3..01e0704 100644 --- a/_src/_Tests/ManualTests/Core.cs +++ b/_src/_Tests/ManualTests/Core.cs @@ -1,4 +1,5 @@ using System; +using System.Threading; using Implementation.Module; using Microsoft.Extensions.DependencyInjection; @@ -9,7 +10,7 @@ internal class Core public IServiceProvider LoadModules() { var collection = new ServiceCollection(); - new CoreModule().RegisterServices(collection, "ManualTests"); + new CoreModule(collection, new CancellationTokenSource()).RegisterServices("ManualTests"); return collection.BuildServiceProvider(); } } diff --git a/_src/_Tests/ManualTests/Dump.cs b/_src/_Tests/ManualTests/Dump.cs index 5537af2..102ac11 100644 --- a/_src/_Tests/ManualTests/Dump.cs +++ b/_src/_Tests/ManualTests/Dump.cs @@ -15,7 +15,6 @@ private void Dumper() Console.ReadLine(); var provider = new Core().LoadModules(); var elemFact = provider.GetService(); - // var test = _reader.ReadAllLines("Adjon meg hosszu szoveget"); var elements = new List>() { elemFact.CreateNavigatorElement("asd", "asdValue"),