From ea243086f592efd9cc29a7f446b49ec3b192e1eb Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Wed, 27 Apr 2022 19:16:03 +0300 Subject: [PATCH 01/29] Install Package. Delete unnesessary --- backend/ServiceSimulation/Api/Api.csproj | 3 ++- backend/ServiceSimulation/Api/Program.cs | 7 +------ backend/ServiceSimulation/Bll.Domain/Bll.Domain.csproj | 1 - .../Bll.Domain/Entities/BufferManagerFactory.cs | 1 - .../ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs | 2 +- 5 files changed, 4 insertions(+), 10 deletions(-) diff --git a/backend/ServiceSimulation/Api/Api.csproj b/backend/ServiceSimulation/Api/Api.csproj index 734b22b..0996f22 100644 --- a/backend/ServiceSimulation/Api/Api.csproj +++ b/backend/ServiceSimulation/Api/Api.csproj @@ -8,7 +8,8 @@ - + + diff --git a/backend/ServiceSimulation/Api/Program.cs b/backend/ServiceSimulation/Api/Program.cs index 60a03a5..95fb6f3 100644 --- a/backend/ServiceSimulation/Api/Program.cs +++ b/backend/ServiceSimulation/Api/Program.cs @@ -17,15 +17,10 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); -//builder.Services.AddTransient(); + builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); -//builder.Services.AddScoped() -// .AddScoped(s => s.GetRequiredService()); - -//builder.Services.AddScoped(s => -// ActivatorUtilities.CreateInstance(s)); #endregion builder.Services.AddMapper(); diff --git a/backend/ServiceSimulation/Bll.Domain/Bll.Domain.csproj b/backend/ServiceSimulation/Bll.Domain/Bll.Domain.csproj index 8b42ece..2de6f23 100644 --- a/backend/ServiceSimulation/Bll.Domain/Bll.Domain.csproj +++ b/backend/ServiceSimulation/Bll.Domain/Bll.Domain.csproj @@ -7,7 +7,6 @@ - diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/BufferManagerFactory.cs b/backend/ServiceSimulation/Bll.Domain/Entities/BufferManagerFactory.cs index 5b8aeca..8de03ec 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/BufferManagerFactory.cs +++ b/backend/ServiceSimulation/Bll.Domain/Entities/BufferManagerFactory.cs @@ -1,7 +1,6 @@ using Api.enums; using Bll.Domain.Factories; using Bll.Domain.Interfaces; -using Castle.DynamicProxy; using Microsoft.Extensions.DependencyInjection; namespace Bll.Domain.Entities; diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs b/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs index db65fcf..eca69cd 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs +++ b/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs @@ -30,7 +30,7 @@ public void TakeRequest(Request request, Device device) public bool FreeDevice(Device device) { - _ = device ?? throw new ArgumentNullException(nameof(device)); + _ = device.Request ?? throw new ArgumentNullException(nameof(device)); device.Request.EndTime = _time.Now; _time.Now = device.Request.EndTime; From 31ec5b06edbd593e08bb9efa080785441881cda5 Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Wed, 27 Apr 2022 20:04:18 +0300 Subject: [PATCH 02/29] Add Cors extension --- backend/ServiceSimulation/Api/Api.csproj | 1 + .../Api/Configuration/CorsPolicies.cs | 23 +++++++++++++++++++ .../Api/Extensions/CorsOptionsExtensions.cs | 6 +++++ backend/ServiceSimulation/Api/Program.cs | 4 ++++ 4 files changed, 34 insertions(+) create mode 100644 backend/ServiceSimulation/Api/Configuration/CorsPolicies.cs create mode 100644 backend/ServiceSimulation/Api/Extensions/CorsOptionsExtensions.cs diff --git a/backend/ServiceSimulation/Api/Api.csproj b/backend/ServiceSimulation/Api/Api.csproj index 0996f22..6d43131 100644 --- a/backend/ServiceSimulation/Api/Api.csproj +++ b/backend/ServiceSimulation/Api/Api.csproj @@ -16,6 +16,7 @@ + diff --git a/backend/ServiceSimulation/Api/Configuration/CorsPolicies.cs b/backend/ServiceSimulation/Api/Configuration/CorsPolicies.cs new file mode 100644 index 0000000..84b5d78 --- /dev/null +++ b/backend/ServiceSimulation/Api/Configuration/CorsPolicies.cs @@ -0,0 +1,23 @@ +using Microsoft.AspNetCore.Cors.Infrastructure; + +namespace Api.Configuration; + +public static class CorsPolicies +{ + public static readonly (string Name, Action ConfigurePolicy) AllowRemoteFrontendWithCredentials = + ( + "AllowRemoteFrontendWithCredentials", + builder => + { + var host = Environment.GetEnvironmentVariable("REMOTE_FRONTEND_HOST"); + var port = Environment.GetEnvironmentVariable("REMOTE_FRONTEND_PORT"); + var scheme = Environment.GetEnvironmentVariable("REMOTE_FRONTEND_SCHEME"); + var origin = $"{scheme}://{host}:{port}"; + builder + .WithOrigins(origin) + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + } + ); +} \ No newline at end of file diff --git a/backend/ServiceSimulation/Api/Extensions/CorsOptionsExtensions.cs b/backend/ServiceSimulation/Api/Extensions/CorsOptionsExtensions.cs new file mode 100644 index 0000000..dd58077 --- /dev/null +++ b/backend/ServiceSimulation/Api/Extensions/CorsOptionsExtensions.cs @@ -0,0 +1,6 @@ +namespace Api.Extensions; + +public class CorsOptionsExtensions +{ + +} \ No newline at end of file diff --git a/backend/ServiceSimulation/Api/Program.cs b/backend/ServiceSimulation/Api/Program.cs index 95fb6f3..8ba076e 100644 --- a/backend/ServiceSimulation/Api/Program.cs +++ b/backend/ServiceSimulation/Api/Program.cs @@ -24,6 +24,10 @@ #endregion builder.Services.AddMapper(); +builder.Services.AddCors(opts => +{ + opts.AddPolicy(CorsPolicies.AllowRemoteFrontendWithCredentials); +}); var app = builder.Build(); From 3c580d6eaa5e6032ed9de22f64b098627534f552 Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Wed, 27 Apr 2022 20:05:00 +0300 Subject: [PATCH 03/29] add cors extension class --- .../Api/Extensions/CorsOptionsExtensions.cs | 12 +++++++++--- backend/ServiceSimulation/Api/Program.cs | 6 ++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/backend/ServiceSimulation/Api/Extensions/CorsOptionsExtensions.cs b/backend/ServiceSimulation/Api/Extensions/CorsOptionsExtensions.cs index dd58077..42807a5 100644 --- a/backend/ServiceSimulation/Api/Extensions/CorsOptionsExtensions.cs +++ b/backend/ServiceSimulation/Api/Extensions/CorsOptionsExtensions.cs @@ -1,6 +1,12 @@ -namespace Api.Extensions; +using Microsoft.AspNetCore.Cors.Infrastructure; -public class CorsOptionsExtensions +namespace Api.Extensions; + +public static class CorsOptionsExtensions { - + public static void AddPolicy(this CorsOptions options, (string Name, Action ConfigurePolicy) arg) + { + options.AddPolicy(arg.Name, arg.ConfigurePolicy); + } + } \ No newline at end of file diff --git a/backend/ServiceSimulation/Api/Program.cs b/backend/ServiceSimulation/Api/Program.cs index 8ba076e..08e8fd9 100644 --- a/backend/ServiceSimulation/Api/Program.cs +++ b/backend/ServiceSimulation/Api/Program.cs @@ -1,4 +1,5 @@ using Api.Configuration; +using Api.Extensions; using Bll.Domain.Entities; using Bll.Domain.Factories; using Bll.Domain.Interfaces; @@ -23,11 +24,16 @@ builder.Services.AddTransient(); #endregion +#region Mapper builder.Services.AddMapper(); +#endregion + +#region CORS builder.Services.AddCors(opts => { opts.AddPolicy(CorsPolicies.AllowRemoteFrontendWithCredentials); }); +#endregion var app = builder.Build(); From 940c4cd24e78191d104a9b12180d37803da9b23a Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Wed, 27 Apr 2022 23:43:02 +0300 Subject: [PATCH 04/29] Add Development config file --- backend/ServiceSimulation/Api/appsettings.Development.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/ServiceSimulation/Api/appsettings.Development.json b/backend/ServiceSimulation/Api/appsettings.Development.json index 0c208ae..e39a2fb 100644 --- a/backend/ServiceSimulation/Api/appsettings.Development.json +++ b/backend/ServiceSimulation/Api/appsettings.Development.json @@ -4,5 +4,10 @@ "Default": "Information", "Microsoft.AspNetCore": "Warning" } - } + }, + + "REMOTE_FRONTEND_SCHEME": "https", + "REMOTE_FRONTEND_HOST": "localhost", + "REMOTE_FRONTEND_PORT": "8081", + "DISABLE_SSL_SERVER_CERTIFICATES_VALIDATION": "true" } From 92a51de6e20ab24f77e4f0b85e6736c0cb703953 Mon Sep 17 00:00:00 2001 From: NiceOneFox <53495952+NiceOneFox@users.noreply.github.com> Date: Thu, 28 Apr 2022 22:41:27 +0300 Subject: [PATCH 05/29] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 426bf38..d36e53a 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ Input parameters: - ASP .NET 6 - C# 10 - AutoMapper +- CORS ## Architecture N-Layer Web API From 3b648117fdca824b629622292b12721eb21cc51d Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Fri, 29 Apr 2022 13:56:59 +0300 Subject: [PATCH 06/29] Restructure project --- .../Api/Configuration/ApiMapperConfigurator.cs | 2 +- backend/ServiceSimulation/Api/Controllers/Simulation.cs | 3 +-- backend/ServiceSimulation/Api/Program.cs | 1 + .../ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs | 1 + .../ServiceSimulation/Bll.Domain/Entities/ResultManager.cs | 2 +- backend/ServiceSimulation/Bll.Domain/Entities/Results.cs | 1 + .../ServiceSimulation/Bll.Domain/Entities/SourceManager.cs | 1 + .../Bll.Domain/Entities/StandardBufferManager.cs | 1 + .../Bll.Domain/Interfaces/IBufferManager.cs | 2 +- .../Bll.Domain/Interfaces/IDeviceManager.cs | 2 +- .../Bll.Domain/Interfaces/IResultManager.cs | 2 +- backend/ServiceSimulation/Bll.Domain/Interfaces/IResults.cs | 2 +- .../Bll.Domain/Interfaces/ISimulationService.cs | 3 +-- .../Bll.Domain/Interfaces/ISourceManager.cs | 2 +- .../Bll.Domain/{Entities => Models}/Device.cs | 2 +- .../Bll.Domain/{Entities => Models}/FinalResults.cs | 2 +- .../Bll.Domain/{Entities => Models}/InputParameters.cs | 2 +- .../Bll.Domain/{Entities => Models}/Request.cs | 2 +- .../Bll.Domain/{Entities => Models}/Source.cs | 2 +- .../Bll.Domain/Services/SimulationService.cs | 5 +++-- 20 files changed, 22 insertions(+), 18 deletions(-) rename backend/ServiceSimulation/Bll.Domain/{Entities => Models}/Device.cs (87%) rename backend/ServiceSimulation/Bll.Domain/{Entities => Models}/FinalResults.cs (85%) rename backend/ServiceSimulation/Bll.Domain/{Entities => Models}/InputParameters.cs (93%) rename backend/ServiceSimulation/Bll.Domain/{Entities => Models}/Request.cs (94%) rename backend/ServiceSimulation/Bll.Domain/{Entities => Models}/Source.cs (87%) diff --git a/backend/ServiceSimulation/Api/Configuration/ApiMapperConfigurator.cs b/backend/ServiceSimulation/Api/Configuration/ApiMapperConfigurator.cs index c744a25..32fc45e 100644 --- a/backend/ServiceSimulation/Api/Configuration/ApiMapperConfigurator.cs +++ b/backend/ServiceSimulation/Api/Configuration/ApiMapperConfigurator.cs @@ -1,6 +1,6 @@ using Api.Entities; using AutoMapper; -using Bll.Domain.Entities; +using Bll.Domain.Models; using Bll.Domain.Interfaces; namespace Api.Configuration; diff --git a/backend/ServiceSimulation/Api/Controllers/Simulation.cs b/backend/ServiceSimulation/Api/Controllers/Simulation.cs index 0e397b1..5f50c73 100644 --- a/backend/ServiceSimulation/Api/Controllers/Simulation.cs +++ b/backend/ServiceSimulation/Api/Controllers/Simulation.cs @@ -1,8 +1,7 @@ using Api.Entities; -using Api.enums; using AutoMapper; -using Bll.Domain.Entities; using Bll.Domain.Interfaces; +using Bll.Domain.Models; using Microsoft.AspNetCore.Mvc; namespace Api.Controllers; diff --git a/backend/ServiceSimulation/Api/Program.cs b/backend/ServiceSimulation/Api/Program.cs index 60a03a5..9c22000 100644 --- a/backend/ServiceSimulation/Api/Program.cs +++ b/backend/ServiceSimulation/Api/Program.cs @@ -2,6 +2,7 @@ using Bll.Domain.Entities; using Bll.Domain.Factories; using Bll.Domain.Interfaces; +using Bll.Domain.Models; using Bll.Domain.Services; var builder = WebApplication.CreateBuilder(args); diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs b/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs index db65fcf..351cb36 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs +++ b/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs @@ -1,4 +1,5 @@ using Bll.Domain.Interfaces; +using Bll.Domain.Models; namespace Bll.Domain.Entities; diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/ResultManager.cs b/backend/ServiceSimulation/Bll.Domain/Entities/ResultManager.cs index 0adb900..5f949df 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/ResultManager.cs +++ b/backend/ServiceSimulation/Bll.Domain/Entities/ResultManager.cs @@ -1,4 +1,5 @@ using Bll.Domain.Interfaces; +using Bll.Domain.Models; namespace Bll.Domain.Entities; @@ -6,7 +7,6 @@ public class ResultManager : IResultManager { private readonly IResults _results; private readonly ITimeProvider _timeProvider; - public ResultManager(IResults results, ITimeProvider timeProvider) { _results = results; diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/Results.cs b/backend/ServiceSimulation/Bll.Domain/Entities/Results.cs index 5494769..b7165fa 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/Results.cs +++ b/backend/ServiceSimulation/Bll.Domain/Entities/Results.cs @@ -1,4 +1,5 @@ using Bll.Domain.Interfaces; +using Bll.Domain.Models; namespace Bll.Domain.Entities; diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/SourceManager.cs b/backend/ServiceSimulation/Bll.Domain/Entities/SourceManager.cs index 0c54e1f..f28fda4 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/SourceManager.cs +++ b/backend/ServiceSimulation/Bll.Domain/Entities/SourceManager.cs @@ -1,4 +1,5 @@ using Bll.Domain.Interfaces; +using Bll.Domain.Models; namespace Bll.Domain.Entities; diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/StandardBufferManager.cs b/backend/ServiceSimulation/Bll.Domain/Entities/StandardBufferManager.cs index baf6474..9c6f1cb 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/StandardBufferManager.cs +++ b/backend/ServiceSimulation/Bll.Domain/Entities/StandardBufferManager.cs @@ -1,4 +1,5 @@ using Bll.Domain.Interfaces; +using Bll.Domain.Models; namespace Bll.Domain.Entities; diff --git a/backend/ServiceSimulation/Bll.Domain/Interfaces/IBufferManager.cs b/backend/ServiceSimulation/Bll.Domain/Interfaces/IBufferManager.cs index 15bddd6..1eb39f8 100644 --- a/backend/ServiceSimulation/Bll.Domain/Interfaces/IBufferManager.cs +++ b/backend/ServiceSimulation/Bll.Domain/Interfaces/IBufferManager.cs @@ -1,4 +1,4 @@ -using Bll.Domain.Entities; +using Bll.Domain.Models; namespace Bll.Domain.Interfaces; diff --git a/backend/ServiceSimulation/Bll.Domain/Interfaces/IDeviceManager.cs b/backend/ServiceSimulation/Bll.Domain/Interfaces/IDeviceManager.cs index 590bd6a..b7c52ef 100644 --- a/backend/ServiceSimulation/Bll.Domain/Interfaces/IDeviceManager.cs +++ b/backend/ServiceSimulation/Bll.Domain/Interfaces/IDeviceManager.cs @@ -1,4 +1,4 @@ -using Bll.Domain.Entities; +using Bll.Domain.Models; namespace Bll.Domain.Interfaces; diff --git a/backend/ServiceSimulation/Bll.Domain/Interfaces/IResultManager.cs b/backend/ServiceSimulation/Bll.Domain/Interfaces/IResultManager.cs index 468f47c..dc67eea 100644 --- a/backend/ServiceSimulation/Bll.Domain/Interfaces/IResultManager.cs +++ b/backend/ServiceSimulation/Bll.Domain/Interfaces/IResultManager.cs @@ -1,4 +1,4 @@ -using Bll.Domain.Entities; +using Bll.Domain.Models; namespace Bll.Domain.Interfaces; diff --git a/backend/ServiceSimulation/Bll.Domain/Interfaces/IResults.cs b/backend/ServiceSimulation/Bll.Domain/Interfaces/IResults.cs index b2f56b6..555264a 100644 --- a/backend/ServiceSimulation/Bll.Domain/Interfaces/IResults.cs +++ b/backend/ServiceSimulation/Bll.Domain/Interfaces/IResults.cs @@ -1,4 +1,4 @@ -using Bll.Domain.Entities; +using Bll.Domain.Models; namespace Bll.Domain.Interfaces; diff --git a/backend/ServiceSimulation/Bll.Domain/Interfaces/ISimulationService.cs b/backend/ServiceSimulation/Bll.Domain/Interfaces/ISimulationService.cs index a9e96fa..ddc52c1 100644 --- a/backend/ServiceSimulation/Bll.Domain/Interfaces/ISimulationService.cs +++ b/backend/ServiceSimulation/Bll.Domain/Interfaces/ISimulationService.cs @@ -1,5 +1,4 @@ -using Api.enums; -using Bll.Domain.Entities; +using Bll.Domain.Models; namespace Bll.Domain.Interfaces; diff --git a/backend/ServiceSimulation/Bll.Domain/Interfaces/ISourceManager.cs b/backend/ServiceSimulation/Bll.Domain/Interfaces/ISourceManager.cs index 0a80f52..b1e3db2 100644 --- a/backend/ServiceSimulation/Bll.Domain/Interfaces/ISourceManager.cs +++ b/backend/ServiceSimulation/Bll.Domain/Interfaces/ISourceManager.cs @@ -1,4 +1,4 @@ -using Bll.Domain.Entities; +using Bll.Domain.Models; namespace Bll.Domain.Interfaces; diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/Device.cs b/backend/ServiceSimulation/Bll.Domain/Models/Device.cs similarity index 87% rename from backend/ServiceSimulation/Bll.Domain/Entities/Device.cs rename to backend/ServiceSimulation/Bll.Domain/Models/Device.cs index a051545..0261ad0 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/Device.cs +++ b/backend/ServiceSimulation/Bll.Domain/Models/Device.cs @@ -1,4 +1,4 @@ -namespace Bll.Domain.Entities; +namespace Bll.Domain.Models; public class Device { diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/FinalResults.cs b/backend/ServiceSimulation/Bll.Domain/Models/FinalResults.cs similarity index 85% rename from backend/ServiceSimulation/Bll.Domain/Entities/FinalResults.cs rename to backend/ServiceSimulation/Bll.Domain/Models/FinalResults.cs index 9f7f09e..1fc69e1 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/FinalResults.cs +++ b/backend/ServiceSimulation/Bll.Domain/Models/FinalResults.cs @@ -1,4 +1,4 @@ -namespace Bll.Domain.Entities; +namespace Bll.Domain.Models; public record FinalResults { diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/InputParameters.cs b/backend/ServiceSimulation/Bll.Domain/Models/InputParameters.cs similarity index 93% rename from backend/ServiceSimulation/Bll.Domain/Entities/InputParameters.cs rename to backend/ServiceSimulation/Bll.Domain/Models/InputParameters.cs index 24b4cc9..aa42635 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/InputParameters.cs +++ b/backend/ServiceSimulation/Bll.Domain/Models/InputParameters.cs @@ -1,6 +1,6 @@ using Api.enums; -namespace Bll.Domain.Entities; +namespace Bll.Domain.Models; public class InputParameters { diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/Request.cs b/backend/ServiceSimulation/Bll.Domain/Models/Request.cs similarity index 94% rename from backend/ServiceSimulation/Bll.Domain/Entities/Request.cs rename to backend/ServiceSimulation/Bll.Domain/Models/Request.cs index bb7b925..9810fbe 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/Request.cs +++ b/backend/ServiceSimulation/Bll.Domain/Models/Request.cs @@ -1,4 +1,4 @@ -namespace Bll.Domain.Entities; +namespace Bll.Domain.Models; public class Request { diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/Source.cs b/backend/ServiceSimulation/Bll.Domain/Models/Source.cs similarity index 87% rename from backend/ServiceSimulation/Bll.Domain/Entities/Source.cs rename to backend/ServiceSimulation/Bll.Domain/Models/Source.cs index f52df5d..a7e9509 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/Source.cs +++ b/backend/ServiceSimulation/Bll.Domain/Models/Source.cs @@ -1,4 +1,4 @@ -namespace Bll.Domain.Entities; +namespace Bll.Domain.Models; public class Source { diff --git a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs index c3249d6..ffbd095 100644 --- a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs +++ b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs @@ -1,5 +1,4 @@ -using Api.enums; -using Bll.Domain.Entities; +using Bll.Domain.Models; using Bll.Domain.Factories; using Bll.Domain.Interfaces; @@ -27,6 +26,7 @@ public SimulationService(ISourceManager sourceManager, public void StartSimulation(InputParameters parameters) { + #region initialize var sources = new List(parameters.NumberOfSources); var devices = new List(parameters.NumberOfDevices); @@ -60,6 +60,7 @@ public void StartSimulation(InputParameters parameters) { _sourceManager.GetNewRequest(source); } + #endregion while (true) { From d347bb7ebe116be22b7ed56dcb67ec76da6fe566 Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Fri, 29 Apr 2022 14:53:57 +0300 Subject: [PATCH 07/29] Add TestClass and Project --- .../Bll.Domain.Tests/Bll.Domain.Tests.csproj | 22 +++++++++++++ .../EntitiesTests/DeviceManagerTests.cs | 32 +++++++++++++++++++ .../Bll.Domain/Entities/DeviceManager.cs | 8 ++--- .../ServiceSimulation/ServiceSimulation.sln | 6 ++++ 4 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 backend/ServiceSimulation/Bll.Domain.Tests/Bll.Domain.Tests.csproj create mode 100644 backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs diff --git a/backend/ServiceSimulation/Bll.Domain.Tests/Bll.Domain.Tests.csproj b/backend/ServiceSimulation/Bll.Domain.Tests/Bll.Domain.Tests.csproj new file mode 100644 index 0000000..57a304b --- /dev/null +++ b/backend/ServiceSimulation/Bll.Domain.Tests/Bll.Domain.Tests.csproj @@ -0,0 +1,22 @@ + + + + net6.0 + enable + + false + + + + + + + + + + + + + + + diff --git a/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs b/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs new file mode 100644 index 0000000..07fd9c4 --- /dev/null +++ b/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NUnit.Framework; + +namespace Bll.Domain.Tests.EntitiesTests +{ + public class DeviceManagerTests + { + private readonly ITimeProvider _time; + + private readonly IResults _resultChannel; + + + [SetUp] + public void Setup() + { + } + + [Test] + public void TakeRequest_NormalCondition_RequestOnDevice() + { + //Arrange + + //Act + + //Assert + } + } +} diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs b/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs index 351cb36..e1e7f93 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs +++ b/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs @@ -7,14 +7,14 @@ public class DeviceManager : IDeviceManager { private readonly ITimeProvider _time; - private readonly IResults _resultChannel; + private readonly IResults _results; private static readonly Random _random = new(); - public DeviceManager(ITimeProvider time, IResults resultChannel) + public DeviceManager(ITimeProvider time, IResults results) { _time = time; - _resultChannel = resultChannel; + _results = results; } public void TakeRequest(Request request, Device device) @@ -36,7 +36,7 @@ public bool FreeDevice(Device device) _time.Now = device.Request.EndTime; - _resultChannel.Processed.Add(device.Request); + _results.Processed.Add(device.Request); device.Request = null; diff --git a/backend/ServiceSimulation/ServiceSimulation.sln b/backend/ServiceSimulation/ServiceSimulation.sln index 2ee7b7b..a706789 100644 --- a/backend/ServiceSimulation/ServiceSimulation.sln +++ b/backend/ServiceSimulation/ServiceSimulation.sln @@ -7,6 +7,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bll.Domain", "Bll.Domain\Bl EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Api", "Api\Api.csproj", "{454394BA-843E-47C5-A8A1-358D5629EEFC}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bll.Domain.Tests", "Bll.Domain.Tests\Bll.Domain.Tests.csproj", "{CDB17E0F-0037-478E-90D7-31C4FD94ED66}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,6 +23,10 @@ Global {454394BA-843E-47C5-A8A1-358D5629EEFC}.Debug|Any CPU.Build.0 = Debug|Any CPU {454394BA-843E-47C5-A8A1-358D5629EEFC}.Release|Any CPU.ActiveCfg = Release|Any CPU {454394BA-843E-47C5-A8A1-358D5629EEFC}.Release|Any CPU.Build.0 = Release|Any CPU + {CDB17E0F-0037-478E-90D7-31C4FD94ED66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CDB17E0F-0037-478E-90D7-31C4FD94ED66}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CDB17E0F-0037-478E-90D7-31C4FD94ED66}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CDB17E0F-0037-478E-90D7-31C4FD94ED66}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From ad8db1704940d00b901ad99eb17a3e364f8c124a Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Fri, 29 Apr 2022 19:57:16 +0300 Subject: [PATCH 08/29] Add FlowProvider. Add Test For takeRequest method --- backend/ServiceSimulation/Api/Program.cs | 10 ++--- .../EntitiesTests/DeviceManagerTests.cs | 41 +++++++++++++++---- .../Bll.Domain/Entities/DeviceManager.cs | 11 ++--- .../Entities/PoissonianFlowProvider.cs | 18 ++++++++ .../Bll.Domain/Interfaces/IFlowProvider.cs | 13 ++++++ 5 files changed, 74 insertions(+), 19 deletions(-) create mode 100644 backend/ServiceSimulation/Bll.Domain/Entities/PoissonianFlowProvider.cs create mode 100644 backend/ServiceSimulation/Bll.Domain/Interfaces/IFlowProvider.cs diff --git a/backend/ServiceSimulation/Api/Program.cs b/backend/ServiceSimulation/Api/Program.cs index 9c22000..ee131c0 100644 --- a/backend/ServiceSimulation/Api/Program.cs +++ b/backend/ServiceSimulation/Api/Program.cs @@ -15,18 +15,14 @@ builder.Services.AddTransient(); builder.Services.AddScoped(); +builder.Services.AddScoped(); + builder.Services.AddScoped(); builder.Services.AddScoped(); -builder.Services.AddScoped(); -//builder.Services.AddTransient(); + builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); -//builder.Services.AddScoped() -// .AddScoped(s => s.GetRequiredService()); - -//builder.Services.AddScoped(s => -// ActivatorUtilities.CreateInstance(s)); #endregion builder.Services.AddMapper(); diff --git a/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs b/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs index 07fd9c4..e392d41 100644 --- a/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs +++ b/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs @@ -1,32 +1,59 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Bll.Domain.Interfaces; +using Bll.Domain.Entities; +using Moq; using NUnit.Framework; +using Bll.Domain.Models; namespace Bll.Domain.Tests.EntitiesTests { + [TestFixture] public class DeviceManagerTests { - private readonly ITimeProvider _time; + private Mock _time; - private readonly IResults _resultChannel; + private Mock _resultChannel; + private Mock _flow; [SetUp] public void Setup() { + _time = new Mock(); + _flow = new Mock(); + _resultChannel = new Mock(); } [Test] public void TakeRequest_NormalCondition_RequestOnDevice() { //Arrange + var timeOfDeviceWillBeFree = 0.4d; + var lambda = 50; + _time.Setup(t => t.Now).Returns(timeOfDeviceWillBeFree); + double expectedTimeOfDeviceWillBeFree = 0.45d; + _flow.Setup(f => f.GetInterval(_time.Object.Now, lambda)).Returns(expectedTimeOfDeviceWillBeFree); + + var request = new Request(2, 15, 0.325555d, 0.0d); + var device = new Device() + { + DeviceId = 4, + IsWorking = false, + Lambda = lambda, + Request = null, + TimeOfDeviceWillBeFree = timeOfDeviceWillBeFree, + }; + + var deviceManager = new DeviceManager(_time.Object, _flow.Object, _resultChannel.Object); //Act + deviceManager.TakeRequest(request, device); //Assert + Assert.NotNull(device.Request); + Assert.AreEqual(device.Request, request); + Assert.AreEqual(device.IsWorking, true); + Assert.AreEqual(device.TimeOfDeviceWillBeFree, expectedTimeOfDeviceWillBeFree); } } -} +} \ No newline at end of file diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs b/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs index e1e7f93..f78ba25 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs +++ b/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs @@ -7,13 +7,14 @@ public class DeviceManager : IDeviceManager { private readonly ITimeProvider _time; - private readonly IResults _results; + private readonly IFlowProvider _flow; - private static readonly Random _random = new(); + private readonly IResults _results; - public DeviceManager(ITimeProvider time, IResults results) + public DeviceManager(ITimeProvider time, IFlowProvider flowProvider, IResults results) { _time = time; + _flow = flowProvider; _results = results; } @@ -26,12 +27,12 @@ public void TakeRequest(Request request, Device device) device.Request = request; device.IsWorking = true; - device.TimeOfDeviceWillBeFree = _time.Now + (-1.0 / device.Lambda) * Math.Log(_random.NextDouble()); + device.TimeOfDeviceWillBeFree = _flow.GetInterval(_time.Now, device.Lambda); } public bool FreeDevice(Device device) { - _ = device ?? throw new ArgumentNullException(nameof(device)); + _ = device.Request ?? throw new ArgumentNullException(nameof(device)); device.Request.EndTime = _time.Now; _time.Now = device.Request.EndTime; diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/PoissonianFlowProvider.cs b/backend/ServiceSimulation/Bll.Domain/Entities/PoissonianFlowProvider.cs new file mode 100644 index 0000000..b316161 --- /dev/null +++ b/backend/ServiceSimulation/Bll.Domain/Entities/PoissonianFlowProvider.cs @@ -0,0 +1,18 @@ +using Bll.Domain.Interfaces; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Bll.Domain.Entities +{ + public class PoissonianFlowProvider : IFlowProvider + { + private static readonly Random _random = new(); + public double GetInterval(double currentTime, double lambda) + { + return currentTime + (-1.0 / lambda) * Math.Log(_random.NextDouble()); + } + } +} diff --git a/backend/ServiceSimulation/Bll.Domain/Interfaces/IFlowProvider.cs b/backend/ServiceSimulation/Bll.Domain/Interfaces/IFlowProvider.cs new file mode 100644 index 0000000..7e19099 --- /dev/null +++ b/backend/ServiceSimulation/Bll.Domain/Interfaces/IFlowProvider.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Bll.Domain.Interfaces +{ + public interface IFlowProvider + { + double GetInterval(double currentTime, double lambda); + } +} From e491f54ab5c7b340faa1c0a519dc1a7add4ade8c Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Fri, 29 Apr 2022 20:01:42 +0300 Subject: [PATCH 09/29] Add within method for double check --- .../Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs b/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs index e392d41..d9d7e94 100644 --- a/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs +++ b/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs @@ -53,7 +53,7 @@ public void TakeRequest_NormalCondition_RequestOnDevice() Assert.NotNull(device.Request); Assert.AreEqual(device.Request, request); Assert.AreEqual(device.IsWorking, true); - Assert.AreEqual(device.TimeOfDeviceWillBeFree, expectedTimeOfDeviceWillBeFree); + Assert.That(device.TimeOfDeviceWillBeFree, Is.EqualTo(expectedTimeOfDeviceWillBeFree).Within(0.000001)); } } } \ No newline at end of file From f68e3367f6717463c352ec22ff14264a2df02dda Mon Sep 17 00:00:00 2001 From: NiceOneFox <53495952+NiceOneFox@users.noreply.github.com> Date: Fri, 29 Apr 2022 20:04:37 +0300 Subject: [PATCH 10/29] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index d36e53a..ee268ae 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,9 @@ Input parameters: - C# 10 - AutoMapper - CORS +### For testing +- NUnit +- Moq ## Architecture N-Layer Web API From f49cf541848a4b4f161d3f50e0b6b4893a422a75 Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Fri, 29 Apr 2022 20:37:48 +0300 Subject: [PATCH 11/29] Add Nullable for EndTime, add flow for source --- .../EntitiesTests/DeviceManagerTests.cs | 2 +- .../Bll.Domain/Entities/DeviceManager.cs | 5 ++--- .../Bll.Domain/Entities/SourceManager.cs | 17 ++++++++--------- .../Bll.Domain/Models/InputParameters.cs | 3 ++- .../Bll.Domain/Models/Request.cs | 4 ++-- .../Bll.Domain/Services/SimulationService.cs | 4 ++-- 6 files changed, 17 insertions(+), 18 deletions(-) diff --git a/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs b/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs index d9d7e94..24a4c85 100644 --- a/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs +++ b/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs @@ -34,7 +34,7 @@ public void TakeRequest_NormalCondition_RequestOnDevice() double expectedTimeOfDeviceWillBeFree = 0.45d; _flow.Setup(f => f.GetInterval(_time.Object.Now, lambda)).Returns(expectedTimeOfDeviceWillBeFree); - var request = new Request(2, 15, 0.325555d, 0.0d); + var request = new Request(2, 15, 0.325555d, null); var device = new Device() { DeviceId = 4, diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs b/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs index f78ba25..6c879a7 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs +++ b/backend/ServiceSimulation/Bll.Domain/Entities/DeviceManager.cs @@ -33,13 +33,12 @@ public void TakeRequest(Request request, Device device) public bool FreeDevice(Device device) { _ = device.Request ?? throw new ArgumentNullException(nameof(device)); - device.Request.EndTime = _time.Now; - _time.Now = device.Request.EndTime; + _time.Now = device.TimeOfDeviceWillBeFree; + device.Request.EndTime = _time.Now; _results.Processed.Add(device.Request); - device.Request = null; device.IsWorking = false; diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/SourceManager.cs b/backend/ServiceSimulation/Bll.Domain/Entities/SourceManager.cs index f28fda4..72ac365 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/SourceManager.cs +++ b/backend/ServiceSimulation/Bll.Domain/Entities/SourceManager.cs @@ -6,24 +6,23 @@ namespace Bll.Domain.Entities; public class SourceManager : ISourceManager { private readonly ITimeProvider _time; - + private readonly IFlowProvider _flow; private readonly IResults _results; - private static Random _random = new(); - - public SourceManager(ITimeProvider time, IResults results) + public SourceManager(ITimeProvider time, IFlowProvider flowProvider, IResults results) { _time = time; + _flow = flowProvider; _results = results; } - public Request GetNewRequest(Source source) + public Request GetNewRequest(Source source) // THIS METHOD HAVE TO RETURN CURRENT Request and generate new? but cause problem with amount of generated and served requests { - var generatedRequest = new Request(source.SourceId, source.SerialNumber, source.TimeOfNextRequest, -1); - - source.TimeOfNextRequest += -(1.0 / source.Lambda) * Math.Log(_random.NextDouble()); + var generatedRequest = new Request(source.SourceId, source.SerialNumber, source.TimeOfNextRequest, null); + + source.TimeOfNextRequest = _flow.GetInterval(source.TimeOfNextRequest, source.Lambda); source.SerialNumber++; - generatedRequest.SerialNumberOfSource = source.SerialNumber; // TODO REFACTOR? + generatedRequest.SerialNumberOfSource = source.SerialNumber; _time.Now = source.TimeOfNextRequest; _results.AmountOfGeneratedRequests++; diff --git a/backend/ServiceSimulation/Bll.Domain/Models/InputParameters.cs b/backend/ServiceSimulation/Bll.Domain/Models/InputParameters.cs index aa42635..cc6a58f 100644 --- a/backend/ServiceSimulation/Bll.Domain/Models/InputParameters.cs +++ b/backend/ServiceSimulation/Bll.Domain/Models/InputParameters.cs @@ -10,5 +10,6 @@ public class InputParameters public int AmountOfRequests { get; set; } = 40; public double ModelingTime { get; set; } = double.MaxValue; public SimulationType SimulationType { get; set; } = SimulationType.Standard; - public double Lambda { get; set; } = 3; + public double LambdaForRequests { get; set; } = 3; + public double LambdaForDevice { get; set; } = 3; } \ No newline at end of file diff --git a/backend/ServiceSimulation/Bll.Domain/Models/Request.cs b/backend/ServiceSimulation/Bll.Domain/Models/Request.cs index 9810fbe..7f54dcb 100644 --- a/backend/ServiceSimulation/Bll.Domain/Models/Request.cs +++ b/backend/ServiceSimulation/Bll.Domain/Models/Request.cs @@ -5,9 +5,9 @@ public class Request public int NumberOfSource { get; set; } public int SerialNumberOfSource { get; set; } public double StartTime { get; set; } - public double EndTime { get; set; } + public double? EndTime { get; set; } - public Request(int numberOfSource, int serialNumberOfSource, double startTime, double endTime) + public Request(int numberOfSource, int serialNumberOfSource, double startTime, double? endTime) { NumberOfSource = numberOfSource; SerialNumberOfSource = serialNumberOfSource; diff --git a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs index ffbd095..f37d4ed 100644 --- a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs +++ b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs @@ -36,7 +36,7 @@ public void StartSimulation(InputParameters parameters) { SourceId = i, SerialNumber = 0, - Lambda = parameters.Lambda, + Lambda = parameters.LambdaForRequests, Priority = 1, TimeOfNextRequest = 0, }); @@ -48,7 +48,7 @@ public void StartSimulation(InputParameters parameters) { DeviceId = i, IsWorking = false, - Lambda = parameters.Lambda, + Lambda = parameters.LambdaForDevice, Request = null, TimeOfDeviceWillBeFree = 0, }); From b9c2e4bc4309f53276645a2c9497312ea0661e43 Mon Sep 17 00:00:00 2001 From: NiceOneFox <53495952+NiceOneFox@users.noreply.github.com> Date: Fri, 29 Apr 2022 20:39:47 +0300 Subject: [PATCH 12/29] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ee268ae..4680845 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,8 @@ Input parameters: * Amount of requests * Modeling time (max time) * SimulationType (Type of buffer modeling, FIFO, LIFO etc.) -* Lambda (amount of flow) parameter for Poissonian flow +* Lambda for devices (amount of flow) parameter for Poissonian flow +* Lambda for sources ## Technologies - ASP .NET 6 From 4b4071fb74f8cf6709c94461ff23939b5b51cd1f Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Sat, 30 Apr 2022 00:32:08 +0300 Subject: [PATCH 13/29] Add Validation --- backend/ServiceSimulation/Api/Api.csproj | 1 + backend/ServiceSimulation/Api/Program.cs | 9 ++++++-- .../Validation/InputParametersValidator.cs | 21 +++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 backend/ServiceSimulation/Api/Validation/InputParametersValidator.cs diff --git a/backend/ServiceSimulation/Api/Api.csproj b/backend/ServiceSimulation/Api/Api.csproj index 6d43131..c210042 100644 --- a/backend/ServiceSimulation/Api/Api.csproj +++ b/backend/ServiceSimulation/Api/Api.csproj @@ -8,6 +8,7 @@ + diff --git a/backend/ServiceSimulation/Api/Program.cs b/backend/ServiceSimulation/Api/Program.cs index 442d3ed..39f0bc6 100644 --- a/backend/ServiceSimulation/Api/Program.cs +++ b/backend/ServiceSimulation/Api/Program.cs @@ -3,12 +3,16 @@ using Bll.Domain.Entities; using Bll.Domain.Factories; using Bll.Domain.Interfaces; -using Bll.Domain.Models; using Bll.Domain.Services; +using FluentValidation.AspNetCore; +using System.Reflection; var builder = WebApplication.CreateBuilder(args); -builder.Services.AddControllers(); +builder.Services.AddControllers().AddFluentValidation(fv => +{ + fv.RegisterValidatorsFromAssembly(Assembly.GetExecutingAssembly()); +}); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); @@ -37,6 +41,7 @@ }); #endregion + var app = builder.Build(); if (app.Environment.IsDevelopment()) diff --git a/backend/ServiceSimulation/Api/Validation/InputParametersValidator.cs b/backend/ServiceSimulation/Api/Validation/InputParametersValidator.cs new file mode 100644 index 0000000..6c96671 --- /dev/null +++ b/backend/ServiceSimulation/Api/Validation/InputParametersValidator.cs @@ -0,0 +1,21 @@ +using FluentValidation; +using Bll.Domain.Models; +using Api.enums; + +namespace Api.Validation +{ + public class InputParametersValidator : AbstractValidator + { + public InputParametersValidator() + { + RuleFor(p => p.NumberOfSources).NotEmpty().InclusiveBetween(1, 100); + RuleFor(p => p.NumberOfDevices).NotEmpty().InclusiveBetween(1, 100); + RuleFor(p => p.AmountOfRequests).NotEmpty().InclusiveBetween(1, 5000); + RuleFor(p => p.BufferSize).NotEmpty().InclusiveBetween(1, 100); + RuleFor(p => p.LambdaForDevice).NotEmpty().ExclusiveBetween(0, 10000); + RuleFor(p => p.NumberOfSources).NotEmpty().ExclusiveBetween(0, 10000); + RuleFor(p => p.ModelingTime).NotEmpty().ExclusiveBetween(0, 10000); + RuleFor(p => p.SimulationType).IsInEnum(); + } + } +} \ No newline at end of file From af8f199e80662beed2f3813225ab83d2b0524704 Mon Sep 17 00:00:00 2001 From: NiceOneFox <53495952+NiceOneFox@users.noreply.github.com> Date: Sat, 30 Apr 2022 00:41:54 +0300 Subject: [PATCH 14/29] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4680845..3e940cf 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ Input parameters: - ASP .NET 6 - C# 10 - AutoMapper +- FluentValidation - CORS ### For testing - NUnit From 542e18f05f40bc34a1ca52fac273f40ba0a283e2 Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Sat, 30 Apr 2022 14:23:48 +0300 Subject: [PATCH 15/29] AddValidation --- backend/ServiceSimulation/Api/Api.csproj | 3 +- .../Api/Controllers/Simulation.cs | 4 ++ ...tomExceptionHandlerMiddlewareExtensions.cs | 12 ++++ .../CustomExceptionHandlerMiddleware.cs | 59 +++++++++++++++++++ backend/ServiceSimulation/Api/Program.cs | 10 +++- 5 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 backend/ServiceSimulation/Api/Extensions/CustomExceptionHandlerMiddlewareExtensions.cs create mode 100644 backend/ServiceSimulation/Api/Middlewares/CustomExceptionHandlerMiddleware.cs diff --git a/backend/ServiceSimulation/Api/Api.csproj b/backend/ServiceSimulation/Api/Api.csproj index c210042..5c03782 100644 --- a/backend/ServiceSimulation/Api/Api.csproj +++ b/backend/ServiceSimulation/Api/Api.csproj @@ -8,7 +8,9 @@ + + @@ -17,7 +19,6 @@ - diff --git a/backend/ServiceSimulation/Api/Controllers/Simulation.cs b/backend/ServiceSimulation/Api/Controllers/Simulation.cs index 5f50c73..2912a2f 100644 --- a/backend/ServiceSimulation/Api/Controllers/Simulation.cs +++ b/backend/ServiceSimulation/Api/Controllers/Simulation.cs @@ -1,7 +1,9 @@ using Api.Entities; +using Api.Validation; using AutoMapper; using Bll.Domain.Interfaces; using Bll.Domain.Models; +using FluentValidation; using Microsoft.AspNetCore.Mvc; namespace Api.Controllers; @@ -30,6 +32,8 @@ public Simulation(ISimulationService simulationService, [HttpGet("/start")] public IActionResult Start(InputParameters parameters) { + new InputParametersValidator().ValidateAndThrow(parameters); + _simulationService.StartSimulation(parameters); var endResultsOfModeling = _resultManager.CalculateResultsOfModeling(); var apiResults = _mapper.Map((endResultsOfModeling, _results)); diff --git a/backend/ServiceSimulation/Api/Extensions/CustomExceptionHandlerMiddlewareExtensions.cs b/backend/ServiceSimulation/Api/Extensions/CustomExceptionHandlerMiddlewareExtensions.cs new file mode 100644 index 0000000..fc9557c --- /dev/null +++ b/backend/ServiceSimulation/Api/Extensions/CustomExceptionHandlerMiddlewareExtensions.cs @@ -0,0 +1,12 @@ +using Api.Middlewares; + +namespace Api.Extensions +{ + public static class CustomExceptionHandlerMiddlewareExtensions + { + public static IApplicationBuilder UseCustomExceptionHandler(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } + } +} diff --git a/backend/ServiceSimulation/Api/Middlewares/CustomExceptionHandlerMiddleware.cs b/backend/ServiceSimulation/Api/Middlewares/CustomExceptionHandlerMiddleware.cs new file mode 100644 index 0000000..d82dc21 --- /dev/null +++ b/backend/ServiceSimulation/Api/Middlewares/CustomExceptionHandlerMiddleware.cs @@ -0,0 +1,59 @@ +using System.Net; +using System.Text.Json; +using FluentValidation; + +namespace Api.Middlewares +{ + public class CustomExceptionHandlerMiddleware + { + private readonly RequestDelegate _next; + + // private readonly ILogger _logger; + public CustomExceptionHandlerMiddleware(RequestDelegate next)//, + // ILogger logger) + { + _next = next; + //_logger = logger; + } + + public async Task Invoke(HttpContext context) + { + try + { + await _next(context); + } + catch (Exception ex) + { + await HandleExceptionAsync(context, ex); + } + } + + private Task HandleExceptionAsync(HttpContext context, Exception ex) + { + var statusCode = HttpStatusCode.InternalServerError; + var result = string.Empty; + + switch (ex) + { + case ValidationException validationException: + statusCode = HttpStatusCode.BadRequest; + result = JsonSerializer.Serialize(validationException.Errors); + //_logger.LogDebug(validationException.Message); + break; + + default: + statusCode = HttpStatusCode.NotFound; + break; + + } + context.Response.ContentType = "application/json"; + context.Response.StatusCode = (int)statusCode; + + if (result == string.Empty) + { + result = JsonSerializer.Serialize(new { error = ex.Message }); + } + return context.Response.WriteAsync(result); + } + } +} \ No newline at end of file diff --git a/backend/ServiceSimulation/Api/Program.cs b/backend/ServiceSimulation/Api/Program.cs index 39f0bc6..5ced5ba 100644 --- a/backend/ServiceSimulation/Api/Program.cs +++ b/backend/ServiceSimulation/Api/Program.cs @@ -1,9 +1,12 @@ using Api.Configuration; using Api.Extensions; +using Api.Validation; using Bll.Domain.Entities; using Bll.Domain.Factories; using Bll.Domain.Interfaces; +using Bll.Domain.Models; using Bll.Domain.Services; +using FluentValidation; using FluentValidation.AspNetCore; using System.Reflection; @@ -11,7 +14,8 @@ builder.Services.AddControllers().AddFluentValidation(fv => { - fv.RegisterValidatorsFromAssembly(Assembly.GetExecutingAssembly()); + //fv.RegisterValidatorsFromAssembly(Assembly.GetExecutingAssembly()); +fv.RegisterValidatorsFromAssemblyContaining(); }); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); @@ -28,6 +32,8 @@ builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); + +builder.Services.AddTransient, InputParametersValidator>(); #endregion #region Mapper @@ -50,6 +56,8 @@ app.UseSwaggerUI(); } +app.UseCustomExceptionHandler(); + app.UseHttpsRedirection(); app.UseAuthorization(); From 5016f67229eacc303ea36f4e2b50c8d8b907fbb7 Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Sat, 30 Apr 2022 16:32:24 +0300 Subject: [PATCH 16/29] Setup NLog --- backend/ServiceSimulation/Api/Api.csproj | 3 ++ .../CustomExceptionHandlerMiddleware.cs | 10 ++--- backend/ServiceSimulation/Api/Program.cs | 9 +++- .../ServiceSimulation/Api/appsettings.json | 7 ++-- backend/ServiceSimulation/Api/nlog.config | 41 +++++++++++++++++++ 5 files changed, 60 insertions(+), 10 deletions(-) create mode 100644 backend/ServiceSimulation/Api/nlog.config diff --git a/backend/ServiceSimulation/Api/Api.csproj b/backend/ServiceSimulation/Api/Api.csproj index 5c03782..2dd2516 100644 --- a/backend/ServiceSimulation/Api/Api.csproj +++ b/backend/ServiceSimulation/Api/Api.csproj @@ -12,6 +12,9 @@ + + + diff --git a/backend/ServiceSimulation/Api/Middlewares/CustomExceptionHandlerMiddleware.cs b/backend/ServiceSimulation/Api/Middlewares/CustomExceptionHandlerMiddleware.cs index d82dc21..72b0bfd 100644 --- a/backend/ServiceSimulation/Api/Middlewares/CustomExceptionHandlerMiddleware.cs +++ b/backend/ServiceSimulation/Api/Middlewares/CustomExceptionHandlerMiddleware.cs @@ -8,12 +8,12 @@ public class CustomExceptionHandlerMiddleware { private readonly RequestDelegate _next; - // private readonly ILogger _logger; - public CustomExceptionHandlerMiddleware(RequestDelegate next)//, - // ILogger logger) + private readonly ILogger _logger; + public CustomExceptionHandlerMiddleware(RequestDelegate next, + ILogger logger) { _next = next; - //_logger = logger; + _logger = logger; } public async Task Invoke(HttpContext context) @@ -38,7 +38,7 @@ private Task HandleExceptionAsync(HttpContext context, Exception ex) case ValidationException validationException: statusCode = HttpStatusCode.BadRequest; result = JsonSerializer.Serialize(validationException.Errors); - //_logger.LogDebug(validationException.Message); + _logger.LogDebug(validationException.Message); break; default: diff --git a/backend/ServiceSimulation/Api/Program.cs b/backend/ServiceSimulation/Api/Program.cs index 5ced5ba..77ed923 100644 --- a/backend/ServiceSimulation/Api/Program.cs +++ b/backend/ServiceSimulation/Api/Program.cs @@ -8,15 +8,20 @@ using Bll.Domain.Services; using FluentValidation; using FluentValidation.AspNetCore; -using System.Reflection; +using NLog.Web; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers().AddFluentValidation(fv => { - //fv.RegisterValidatorsFromAssembly(Assembly.GetExecutingAssembly()); fv.RegisterValidatorsFromAssemblyContaining(); }); + +#region Logger +builder.Logging.ClearProviders(); +builder.Logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); +builder.Host.UseNLog(); +#endregion builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); diff --git a/backend/ServiceSimulation/Api/appsettings.json b/backend/ServiceSimulation/Api/appsettings.json index 10f68b8..6c21411 100644 --- a/backend/ServiceSimulation/Api/appsettings.json +++ b/backend/ServiceSimulation/Api/appsettings.json @@ -1,9 +1,10 @@ { "Logging": { "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" + "Default": "Trace", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*" -} +} \ No newline at end of file diff --git a/backend/ServiceSimulation/Api/nlog.config b/backend/ServiceSimulation/Api/nlog.config new file mode 100644 index 0000000..0c85d03 --- /dev/null +++ b/backend/ServiceSimulation/Api/nlog.config @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 4a22e7c8f8bc42108c5deb994624308eafa24ecd Mon Sep 17 00:00:00 2001 From: NiceOneFox <53495952+NiceOneFox@users.noreply.github.com> Date: Sat, 30 Apr 2022 16:38:42 +0300 Subject: [PATCH 17/29] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 3e940cf..226fe9e 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,8 @@ Input parameters: - AutoMapper - FluentValidation - CORS +- NLog + ### For testing - NUnit - Moq From 9dcc13d06a1997366a49710ca21a2c3e02b3f113 Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Sat, 30 Apr 2022 17:44:00 +0300 Subject: [PATCH 18/29] Add Unit tests for FreeDevice --- .../EntitiesTests/DeviceManagerTests.cs | 60 +++++++++++++++++-- .../Bll.Domain/Services/SimulationService.cs | 2 - 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs b/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs index 24a4c85..01739c3 100644 --- a/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs +++ b/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs @@ -1,9 +1,11 @@ -using System; +using System.Linq; using Bll.Domain.Interfaces; using Bll.Domain.Entities; using Moq; using NUnit.Framework; using Bll.Domain.Models; +using System.Collections.Generic; +using System; namespace Bll.Domain.Tests.EntitiesTests { @@ -12,7 +14,7 @@ public class DeviceManagerTests { private Mock _time; - private Mock _resultChannel; + private Mock _results; private Mock _flow; @@ -21,7 +23,7 @@ public void Setup() { _time = new Mock(); _flow = new Mock(); - _resultChannel = new Mock(); + _results = new Mock(); } [Test] @@ -44,7 +46,7 @@ public void TakeRequest_NormalCondition_RequestOnDevice() TimeOfDeviceWillBeFree = timeOfDeviceWillBeFree, }; - var deviceManager = new DeviceManager(_time.Object, _flow.Object, _resultChannel.Object); + var deviceManager = new DeviceManager(_time.Object, _flow.Object, _results.Object); //Act deviceManager.TakeRequest(request, device); @@ -55,5 +57,55 @@ public void TakeRequest_NormalCondition_RequestOnDevice() Assert.AreEqual(device.IsWorking, true); Assert.That(device.TimeOfDeviceWillBeFree, Is.EqualTo(expectedTimeOfDeviceWillBeFree).Within(0.000001)); } + + [Test] + public void FreeDevice_NormalCondition_DeviceIsFree() + { + //Arrange + double timeOfDeviceWillBeFree = 0.52045; + + var requestOnDevice = new Request(4, 23, 0.45667, null); + + var device = new Device() + { + DeviceId = 7, + IsWorking = true, + Lambda = 99, + Request = requestOnDevice, + TimeOfDeviceWillBeFree = timeOfDeviceWillBeFree, + }; + _results.Setup(r => r.Processed).Returns(new List()); + _time.SetupAllProperties(); + + var deviceManager = new DeviceManager(_time.Object, _flow.Object, _results.Object); + //Act + deviceManager.FreeDevice(device); + //Assert + Assert.AreEqual(device.IsWorking, false); + Assert.AreEqual(_time.Object.Now, device.TimeOfDeviceWillBeFree); + Assert.AreEqual(_results.Object.Processed.Last().EndTime, _time.Object.Now); + Assert.AreEqual(_results.Object.Processed.Count, 1); + } + + [Test] + public void FreeDevice_RequestOnDeviceIsNull_ThrowArgumentNullException() + { + //Arrange + Request? requestOnDevice = null; + + var device = new Device() + { + DeviceId = 7, + IsWorking = true, + Lambda = 99, + Request = requestOnDevice, + TimeOfDeviceWillBeFree = 0.4d, + }; + + var deviceManager = new DeviceManager(_time.Object, _flow.Object, _results.Object); + //Act + //Assert + Assert.Throws (() => deviceManager.FreeDevice(device)); + } } } \ No newline at end of file diff --git a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs index f37d4ed..629126a 100644 --- a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs +++ b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs @@ -116,8 +116,6 @@ private void FindNextSpecialEvent(List devices, List sources, IB else { // Take request on work or add to buffer. - //if (_results.AmountOfGeneratedRequests >= parameters.AmountOfRequests) return; - var newRequestInSystem = _sourceManager.GetNewRequest(sources[indexOfRequestWithClosestTimeCome]); // find out free device bool wasFreeDevice = false; From 7424331ef5fe1d358714523e101371c7682f914a Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Sat, 30 Apr 2022 18:22:10 +0300 Subject: [PATCH 19/29] Add Lifo buffer manager --- .../Validation/InputParametersValidator.cs | 2 +- .../Entities/BufferManagerFactory.cs | 9 ++-- .../Bll.Domain/Entities/LIFOBufferManager.cs | 49 +++++++++++++++++++ .../Entities/StandardBufferManager.cs | 2 +- .../Factories/IBufferManagerFactory.cs | 2 +- .../Bll.Domain/Models/InputParameters.cs | 2 +- .../Bll.Domain/Services/SimulationService.cs | 2 +- .../Bll.Domain/enums/SimulationType.cs | 5 +- 8 files changed, 63 insertions(+), 10 deletions(-) create mode 100644 backend/ServiceSimulation/Bll.Domain/Entities/LIFOBufferManager.cs diff --git a/backend/ServiceSimulation/Api/Validation/InputParametersValidator.cs b/backend/ServiceSimulation/Api/Validation/InputParametersValidator.cs index 6c96671..a5d3ad1 100644 --- a/backend/ServiceSimulation/Api/Validation/InputParametersValidator.cs +++ b/backend/ServiceSimulation/Api/Validation/InputParametersValidator.cs @@ -15,7 +15,7 @@ public InputParametersValidator() RuleFor(p => p.LambdaForDevice).NotEmpty().ExclusiveBetween(0, 10000); RuleFor(p => p.NumberOfSources).NotEmpty().ExclusiveBetween(0, 10000); RuleFor(p => p.ModelingTime).NotEmpty().ExclusiveBetween(0, 10000); - RuleFor(p => p.SimulationType).IsInEnum(); + RuleFor(p => p.BufferType).IsInEnum(); } } } \ No newline at end of file diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/BufferManagerFactory.cs b/backend/ServiceSimulation/Bll.Domain/Entities/BufferManagerFactory.cs index 8de03ec..3b701b3 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/BufferManagerFactory.cs +++ b/backend/ServiceSimulation/Bll.Domain/Entities/BufferManagerFactory.cs @@ -14,12 +14,15 @@ public BufferManagerFactory(IServiceProvider serviceProvider) _serviceProvider = serviceProvider; } - public IBufferManager CreateBufferManager(SimulationType simulationType, int capacity) + public IBufferManager CreateBufferManager(BufferType bufferType, int capacity) { - return simulationType switch + return bufferType switch { - 0 => new StandardBufferManager(_serviceProvider.GetRequiredService(), + BufferType.FIFO => new StandardBufferManager(_serviceProvider.GetRequiredService(), _serviceProvider.GetRequiredService(), capacity), + BufferType.LIFO => new LIFOBufferManager(_serviceProvider.GetRequiredService(), + _serviceProvider.GetRequiredService(), capacity), + _ => throw new NotImplementedException() }; } diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/LIFOBufferManager.cs b/backend/ServiceSimulation/Bll.Domain/Entities/LIFOBufferManager.cs new file mode 100644 index 0000000..d8a9b5c --- /dev/null +++ b/backend/ServiceSimulation/Bll.Domain/Entities/LIFOBufferManager.cs @@ -0,0 +1,49 @@ +using Bll.Domain.Interfaces; +using Bll.Domain.Models; + +namespace Bll.Domain.Entities +{ + public class LIFOBufferManager : IBufferManager + { + private readonly IResults _results; + + private readonly ITimeProvider _time; + + private readonly LinkedList _requests = new(); + + public readonly int Capacity = 4; + + public LIFOBufferManager(IResults resultChannel, ITimeProvider time, int capacity) + { + _results = resultChannel; + _time = time; + Capacity = capacity; + } + + public void Add(Request request) + { + if (_requests.Count >= Capacity) + { + var removedRequest = _requests.Last(); + _requests.RemoveLast(); + + removedRequest.EndTime = _time.Now; + _results.Cancelled.Add(removedRequest); + } + + _requests.AddFirst(request); + } + + public Request Get() + { + if (IsFree()) throw new ArgumentNullException("Buffer was empty"); // TODO template string for Ex + + var requestFromBuffer = _requests.First(); + _requests.RemoveFirst(); + + return requestFromBuffer; + } + + public bool IsFree() => _requests.Count == 0; + } +} diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/StandardBufferManager.cs b/backend/ServiceSimulation/Bll.Domain/Entities/StandardBufferManager.cs index 9c6f1cb..765003c 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/StandardBufferManager.cs +++ b/backend/ServiceSimulation/Bll.Domain/Entities/StandardBufferManager.cs @@ -11,7 +11,7 @@ public class StandardBufferManager : IBufferManager private readonly LinkedList _requests = new(); - public int Capacity = 4; + public readonly int Capacity = 4; public StandardBufferManager(IResults resultChannel, ITimeProvider time, int capacity) { diff --git a/backend/ServiceSimulation/Bll.Domain/Factories/IBufferManagerFactory.cs b/backend/ServiceSimulation/Bll.Domain/Factories/IBufferManagerFactory.cs index 03669d8..5da049b 100644 --- a/backend/ServiceSimulation/Bll.Domain/Factories/IBufferManagerFactory.cs +++ b/backend/ServiceSimulation/Bll.Domain/Factories/IBufferManagerFactory.cs @@ -5,5 +5,5 @@ namespace Bll.Domain.Factories; public interface IBufferManagerFactory { - IBufferManager CreateBufferManager(SimulationType simulationType, int capacity); + IBufferManager CreateBufferManager(BufferType simulationType, int capacity); } \ No newline at end of file diff --git a/backend/ServiceSimulation/Bll.Domain/Models/InputParameters.cs b/backend/ServiceSimulation/Bll.Domain/Models/InputParameters.cs index cc6a58f..69e809a 100644 --- a/backend/ServiceSimulation/Bll.Domain/Models/InputParameters.cs +++ b/backend/ServiceSimulation/Bll.Domain/Models/InputParameters.cs @@ -9,7 +9,7 @@ public class InputParameters public int BufferSize { get; set; } = 2; public int AmountOfRequests { get; set; } = 40; public double ModelingTime { get; set; } = double.MaxValue; - public SimulationType SimulationType { get; set; } = SimulationType.Standard; + public BufferType BufferType { get; set; } = BufferType.FIFO; public double LambdaForRequests { get; set; } = 3; public double LambdaForDevice { get; set; } = 3; } \ No newline at end of file diff --git a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs index 629126a..a6945bd 100644 --- a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs +++ b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs @@ -54,7 +54,7 @@ public void StartSimulation(InputParameters parameters) }); } - var bufferManager = _bufferManagerFactory.CreateBufferManager(parameters.SimulationType, parameters.BufferSize); + var bufferManager = _bufferManagerFactory.CreateBufferManager(parameters.BufferType, parameters.BufferSize); foreach (var source in sources) // Generate first requests that generated by sources. { diff --git a/backend/ServiceSimulation/Bll.Domain/enums/SimulationType.cs b/backend/ServiceSimulation/Bll.Domain/enums/SimulationType.cs index 90ec073..8417ded 100644 --- a/backend/ServiceSimulation/Bll.Domain/enums/SimulationType.cs +++ b/backend/ServiceSimulation/Bll.Domain/enums/SimulationType.cs @@ -1,6 +1,7 @@ namespace Api.enums; -public enum SimulationType +public enum BufferType { - Standard = 0 + FIFO = 0, + LIFO = 1 } \ No newline at end of file From 5fd6f729f1eb446fd8f64b89a7e2842d51c51c64 Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Sun, 1 May 2022 13:57:30 +0300 Subject: [PATCH 20/29] Add factory and implementations --- .../Entities/CircleDeviceDirector.cs | 20 ++++++++++++ .../Entities/DeviceDirectorFactory.cs | 18 +++++++++++ .../Factories/IDeviceDirectorFactory.cs | 10 ++++++ .../Bll.Domain/Interfaces/IDeviceDirector.cs | 10 ++++++ .../Bll.Domain/Services/SimulationService.cs | 32 +++++++++---------- .../Bll.Domain/enums/DeviceDirectorType.cs | 8 +++++ 6 files changed, 82 insertions(+), 16 deletions(-) create mode 100644 backend/ServiceSimulation/Bll.Domain/Entities/CircleDeviceDirector.cs create mode 100644 backend/ServiceSimulation/Bll.Domain/Entities/DeviceDirectorFactory.cs create mode 100644 backend/ServiceSimulation/Bll.Domain/Factories/IDeviceDirectorFactory.cs create mode 100644 backend/ServiceSimulation/Bll.Domain/Interfaces/IDeviceDirector.cs create mode 100644 backend/ServiceSimulation/Bll.Domain/enums/DeviceDirectorType.cs diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/CircleDeviceDirector.cs b/backend/ServiceSimulation/Bll.Domain/Entities/CircleDeviceDirector.cs new file mode 100644 index 0000000..38ee5e6 --- /dev/null +++ b/backend/ServiceSimulation/Bll.Domain/Entities/CircleDeviceDirector.cs @@ -0,0 +1,20 @@ +using Bll.Domain.Interfaces; +using Bll.Domain.Models; + +namespace Bll.Domain.Entities +{ + public class CircleDeviceDirector : IDeviceDirector + { + public Device? ChooseDevice(IEnumerable devices, IDeviceManager deviceManager) + { + foreach (var device in devices) + { + if (!device.IsWorking) + { + return device; + } + } + return null; + } + } +} diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/DeviceDirectorFactory.cs b/backend/ServiceSimulation/Bll.Domain/Entities/DeviceDirectorFactory.cs new file mode 100644 index 0000000..63cf430 --- /dev/null +++ b/backend/ServiceSimulation/Bll.Domain/Entities/DeviceDirectorFactory.cs @@ -0,0 +1,18 @@ +using Bll.Domain.enums; +using Bll.Domain.Factories; +using Bll.Domain.Interfaces; + +namespace Bll.Domain.Entities +{ + public class DeviceDirectorFactory : IDeviceDirectorFactory + { + public IDeviceDirector CreateDeviceDirector(DeviceDirectorType deviceDirectorType) + { + return deviceDirectorType switch + { + 0 => new CircleDeviceDirector(), + _ => throw new NotImplementedException(), + }; + } + } +} diff --git a/backend/ServiceSimulation/Bll.Domain/Factories/IDeviceDirectorFactory.cs b/backend/ServiceSimulation/Bll.Domain/Factories/IDeviceDirectorFactory.cs new file mode 100644 index 0000000..2d2b45e --- /dev/null +++ b/backend/ServiceSimulation/Bll.Domain/Factories/IDeviceDirectorFactory.cs @@ -0,0 +1,10 @@ +using Bll.Domain.enums; +using Bll.Domain.Interfaces; + +namespace Bll.Domain.Factories +{ + public interface IDeviceDirectorFactory + { + public IDeviceDirector CreateDeviceDirector(DeviceDirectorType deviceDirectorType); + } +} diff --git a/backend/ServiceSimulation/Bll.Domain/Interfaces/IDeviceDirector.cs b/backend/ServiceSimulation/Bll.Domain/Interfaces/IDeviceDirector.cs new file mode 100644 index 0000000..f839b60 --- /dev/null +++ b/backend/ServiceSimulation/Bll.Domain/Interfaces/IDeviceDirector.cs @@ -0,0 +1,10 @@ + +using Bll.Domain.Models; + +namespace Bll.Domain.Interfaces +{ + public interface IDeviceDirector + { + Device? ChooseDevice(IEnumerable devices, IDeviceManager deviceManager); + } +} diff --git a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs index a6945bd..3e50317 100644 --- a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs +++ b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs @@ -9,17 +9,20 @@ public class SimulationService : ISimulationService private readonly ISourceManager _sourceManager; private readonly IDeviceManager _deviceManager; private readonly IBufferManagerFactory _bufferManagerFactory; + private readonly IDeviceDirectorFactory _deviceDirectorFactory; private readonly IResults _results; private readonly ITimeProvider _time; public SimulationService(ISourceManager sourceManager, IDeviceManager deviceManager, - IBufferManagerFactory bufferManagerFactory, + IBufferManagerFactory bufferManagerFactory, + IDeviceDirectorFactory deviceDirectorFactory, IResults results, ITimeProvider time) { _sourceManager = sourceManager; _deviceManager = deviceManager; _bufferManagerFactory = bufferManagerFactory; + _deviceDirectorFactory = deviceDirectorFactory; _results = results; _time = time; } @@ -55,7 +58,8 @@ public void StartSimulation(InputParameters parameters) } var bufferManager = _bufferManagerFactory.CreateBufferManager(parameters.BufferType, parameters.BufferSize); - + var deviceDirector = _deviceDirectorFactory.CreateDeviceDirector(enums.DeviceDirectorType.Circle); // TODO input param + foreach (var source in sources) // Generate first requests that generated by sources. { _sourceManager.GetNewRequest(source); @@ -72,11 +76,12 @@ public void StartSimulation(InputParameters parameters) { break; } - FindNextSpecialEvent(devices, sources, bufferManager, parameters); + FindNextSpecialEvent(devices, sources, bufferManager, deviceDirector, parameters); } } - private void FindNextSpecialEvent(List devices, List sources, IBufferManager bufferManager, InputParameters parameters) + private void FindNextSpecialEvent(List devices, List sources, IBufferManager bufferManager, + IDeviceDirector deviceDirector, InputParameters parameters) { double timeOfClosestRequestCome = double.MaxValue; double timeOfClosestDeviceFree = double.MaxValue; @@ -118,20 +123,15 @@ private void FindNextSpecialEvent(List devices, List sources, IB // Take request on work or add to buffer. var newRequestInSystem = _sourceManager.GetNewRequest(sources[indexOfRequestWithClosestTimeCome]); // find out free device - bool wasFreeDevice = false; - foreach (var device in devices) - { - if (!device.IsWorking) - { - _deviceManager.TakeRequest(newRequestInSystem, device); - wasFreeDevice = true; - break; - } - } - if (!wasFreeDevice) + var freeDevice = deviceDirector.ChooseDevice(devices, _deviceManager); // init deviceDirector with devicemanager + + if (freeDevice is not null) + { + _deviceManager.TakeRequest(newRequestInSystem, freeDevice); + } + else { - // Add request to buffer if no free devices were found bufferManager.Add(newRequestInSystem); } } diff --git a/backend/ServiceSimulation/Bll.Domain/enums/DeviceDirectorType.cs b/backend/ServiceSimulation/Bll.Domain/enums/DeviceDirectorType.cs new file mode 100644 index 0000000..7a6d508 --- /dev/null +++ b/backend/ServiceSimulation/Bll.Domain/enums/DeviceDirectorType.cs @@ -0,0 +1,8 @@ + +namespace Bll.Domain.enums +{ + public enum DeviceDirectorType + { + Circle = 0 + } +} From 9f5ec5ae3b3dfc5d849b7e0de8c341cd188c02bd Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Sun, 1 May 2022 14:19:01 +0300 Subject: [PATCH 21/29] AddAsync to ServiceSimulation --- backend/ServiceSimulation/Api/Controllers/Simulation.cs | 4 ++-- .../Bll.Domain/Interfaces/ISimulationService.cs | 2 +- .../Bll.Domain/Services/SimulationService.cs | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/ServiceSimulation/Api/Controllers/Simulation.cs b/backend/ServiceSimulation/Api/Controllers/Simulation.cs index 2912a2f..71b27d9 100644 --- a/backend/ServiceSimulation/Api/Controllers/Simulation.cs +++ b/backend/ServiceSimulation/Api/Controllers/Simulation.cs @@ -30,11 +30,11 @@ public Simulation(ISimulationService simulationService, } [HttpGet("/start")] - public IActionResult Start(InputParameters parameters) + public async Task Start(InputParameters parameters) { new InputParametersValidator().ValidateAndThrow(parameters); - _simulationService.StartSimulation(parameters); + await _simulationService.StartSimulation(parameters); var endResultsOfModeling = _resultManager.CalculateResultsOfModeling(); var apiResults = _mapper.Map((endResultsOfModeling, _results)); diff --git a/backend/ServiceSimulation/Bll.Domain/Interfaces/ISimulationService.cs b/backend/ServiceSimulation/Bll.Domain/Interfaces/ISimulationService.cs index ddc52c1..54b6032 100644 --- a/backend/ServiceSimulation/Bll.Domain/Interfaces/ISimulationService.cs +++ b/backend/ServiceSimulation/Bll.Domain/Interfaces/ISimulationService.cs @@ -4,5 +4,5 @@ namespace Bll.Domain.Interfaces; public interface ISimulationService { - void StartSimulation(InputParameters parameters); + Task StartSimulation(InputParameters parameters); } \ No newline at end of file diff --git a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs index a6945bd..fa8c1fb 100644 --- a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs +++ b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs @@ -24,7 +24,7 @@ public SimulationService(ISourceManager sourceManager, _time = time; } - public void StartSimulation(InputParameters parameters) + public Task StartSimulation(InputParameters parameters) { #region initialize var sources = new List(parameters.NumberOfSources); @@ -74,6 +74,7 @@ public void StartSimulation(InputParameters parameters) } FindNextSpecialEvent(devices, sources, bufferManager, parameters); } + return Task.CompletedTask; } private void FindNextSpecialEvent(List devices, List sources, IBufferManager bufferManager, InputParameters parameters) From 3b483953dd71874d476ad5e632e39b1bb5bfd885 Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Mon, 2 May 2022 18:33:08 +0300 Subject: [PATCH 22/29] Rename method to Async --- backend/ServiceSimulation/Api/Controllers/Simulation.cs | 2 +- .../Bll.Domain/Interfaces/ISimulationService.cs | 2 +- .../ServiceSimulation/Bll.Domain/Services/SimulationService.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/ServiceSimulation/Api/Controllers/Simulation.cs b/backend/ServiceSimulation/Api/Controllers/Simulation.cs index 71b27d9..3b0dba4 100644 --- a/backend/ServiceSimulation/Api/Controllers/Simulation.cs +++ b/backend/ServiceSimulation/Api/Controllers/Simulation.cs @@ -34,7 +34,7 @@ public async Task Start(InputParameters parameters) { new InputParametersValidator().ValidateAndThrow(parameters); - await _simulationService.StartSimulation(parameters); + await _simulationService.StartSimulationAsync(parameters); var endResultsOfModeling = _resultManager.CalculateResultsOfModeling(); var apiResults = _mapper.Map((endResultsOfModeling, _results)); diff --git a/backend/ServiceSimulation/Bll.Domain/Interfaces/ISimulationService.cs b/backend/ServiceSimulation/Bll.Domain/Interfaces/ISimulationService.cs index 54b6032..e4b14c7 100644 --- a/backend/ServiceSimulation/Bll.Domain/Interfaces/ISimulationService.cs +++ b/backend/ServiceSimulation/Bll.Domain/Interfaces/ISimulationService.cs @@ -4,5 +4,5 @@ namespace Bll.Domain.Interfaces; public interface ISimulationService { - Task StartSimulation(InputParameters parameters); + Task StartSimulationAsync(InputParameters parameters); } \ No newline at end of file diff --git a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs index fa8c1fb..d8a6c3b 100644 --- a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs +++ b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs @@ -24,7 +24,7 @@ public SimulationService(ISourceManager sourceManager, _time = time; } - public Task StartSimulation(InputParameters parameters) + public Task StartSimulationAsync(InputParameters parameters) { #region initialize var sources = new List(parameters.NumberOfSources); From 1f26aa7973e9350801a67a74aea1940bd2481b94 Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Mon, 2 May 2022 22:01:45 +0300 Subject: [PATCH 23/29] Add Algorithm Builder pattern for construct algorithm --- .../Bll.Domain/Entities/AlgorithmBuilder.cs | 32 +++++++++++++ .../Bll.Domain/Models/Algorithm.cs | 11 +++++ .../Bll.Domain/Services/SimulationService.cs | 45 +++++++++++-------- 3 files changed, 69 insertions(+), 19 deletions(-) create mode 100644 backend/ServiceSimulation/Bll.Domain/Entities/AlgorithmBuilder.cs create mode 100644 backend/ServiceSimulation/Bll.Domain/Models/Algorithm.cs diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/AlgorithmBuilder.cs b/backend/ServiceSimulation/Bll.Domain/Entities/AlgorithmBuilder.cs new file mode 100644 index 0000000..4a7da92 --- /dev/null +++ b/backend/ServiceSimulation/Bll.Domain/Entities/AlgorithmBuilder.cs @@ -0,0 +1,32 @@ +using Bll.Domain.Interfaces; + +namespace Bll.Domain.Entities +{ + public class AlgorithmBuilder + { + private Algorithm _algorithm = new(); + + public AlgorithmBuilder WithDeviceManager(IDeviceManager deviceManager) + { + _algorithm.deviceManager = deviceManager; + return this; + } + + public AlgorithmBuilder WithSourceManager(ISourceManager sourceManager) + { + _algorithm.sourceManager = sourceManager; + return this; + } + + public AlgorithmBuilder WithBufferManager(IBufferManager bufferManager) + { + _algorithm.bufferManager = bufferManager; + return this; + } + + public Algorithm Build() + { + return _algorithm; + } + } +} \ No newline at end of file diff --git a/backend/ServiceSimulation/Bll.Domain/Models/Algorithm.cs b/backend/ServiceSimulation/Bll.Domain/Models/Algorithm.cs new file mode 100644 index 0000000..5274ba6 --- /dev/null +++ b/backend/ServiceSimulation/Bll.Domain/Models/Algorithm.cs @@ -0,0 +1,11 @@ +using Bll.Domain.Interfaces; + +namespace Bll.Domain.Entities +{ + public class Algorithm + { + public ISourceManager sourceManager { get; set; } + public IDeviceManager deviceManager { get; set; } + public IBufferManager bufferManager { get; set; } + } +} diff --git a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs index d8a6c3b..5194645 100644 --- a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs +++ b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs @@ -1,6 +1,7 @@ using Bll.Domain.Models; using Bll.Domain.Factories; using Bll.Domain.Interfaces; +using Bll.Domain.Entities; namespace Bll.Domain.Services; @@ -11,10 +12,10 @@ public class SimulationService : ISimulationService private readonly IBufferManagerFactory _bufferManagerFactory; private readonly IResults _results; private readonly ITimeProvider _time; - public SimulationService(ISourceManager sourceManager, - IDeviceManager deviceManager, - IBufferManagerFactory bufferManagerFactory, - IResults results, + public SimulationService(ISourceManager sourceManager, + IDeviceManager deviceManager, + IBufferManagerFactory bufferManagerFactory, + IResults results, ITimeProvider time) { _sourceManager = sourceManager; @@ -55,7 +56,13 @@ public Task StartSimulationAsync(InputParameters parameters) } var bufferManager = _bufferManagerFactory.CreateBufferManager(parameters.BufferType, parameters.BufferSize); - + + var algorithm = new AlgorithmBuilder() + .WithBufferManager(bufferManager) + .WithSourceManager(_sourceManager) + .WithDeviceManager(_deviceManager) + .Build(); + foreach (var source in sources) // Generate first requests that generated by sources. { _sourceManager.GetNewRequest(source); @@ -65,19 +72,19 @@ public Task StartSimulationAsync(InputParameters parameters) while (true) { if (_results.AmountOfGeneratedRequests >= parameters.AmountOfRequests && - bufferManager.IsFree() && - IsAllDevicesFree(devices) || + algorithm.bufferManager.IsFree() && + IsAllDevicesFree(devices) || _time.Now >= parameters.ModelingTime) - // _results.AmountOfServedRequest == parameters.AmountOfRequests) // TODO CHECK FOR REQUESTS ON SOURCES. WHEN TO END SYSTEM MODELING + // _results.AmountOfServedRequest == parameters.AmountOfRequests) // TODO CHECK FOR REQUESTS ON SOURCES. WHEN TO END SYSTEM MODELING { break; } - FindNextSpecialEvent(devices, sources, bufferManager, parameters); + FindNextSpecialEvent(devices, sources, algorithm, parameters); } return Task.CompletedTask; } - private void FindNextSpecialEvent(List devices, List sources, IBufferManager bufferManager, InputParameters parameters) + private void FindNextSpecialEvent(List devices, List sources, Algorithm algorithm, InputParameters parameters) { double timeOfClosestRequestCome = double.MaxValue; double timeOfClosestDeviceFree = double.MaxValue; @@ -85,7 +92,7 @@ private void FindNextSpecialEvent(List devices, List sources, IB int indexOfRequestWithClosestTimeCome = -1; for (int i = 0; i < sources.Count; i++) { - // if (_results.AmountOfGeneratedRequests >= parameters.AmountOfRequests) break; + // if (_results.AmountOfGeneratedRequests >= parameters.AmountOfRequests) break; if (sources[i].TimeOfNextRequest < timeOfClosestRequestCome) { timeOfClosestRequestCome = sources[i].TimeOfNextRequest; @@ -103,28 +110,28 @@ private void FindNextSpecialEvent(List devices, List sources, IB } } - if (timeOfClosestDeviceFree < timeOfClosestRequestCome + if (timeOfClosestDeviceFree < timeOfClosestRequestCome || _results.AmountOfGeneratedRequests == parameters.AmountOfRequests) { - _deviceManager.FreeDevice(devices[indexOfDeviceWithClosestTimeFree]); + algorithm.deviceManager.FreeDevice(devices[indexOfDeviceWithClosestTimeFree]); // Take from buffer and put on device. - if (!bufferManager.IsFree()) + if (!algorithm.bufferManager.IsFree()) { - _deviceManager.TakeRequest(bufferManager.Get(), devices[indexOfDeviceWithClosestTimeFree]); + algorithm.deviceManager.TakeRequest(algorithm.bufferManager.Get(), devices[indexOfDeviceWithClosestTimeFree]); } } else { - // Take request on work or add to buffer. - var newRequestInSystem = _sourceManager.GetNewRequest(sources[indexOfRequestWithClosestTimeCome]); + var newRequestInSystem = algorithm.sourceManager.GetNewRequest(sources[indexOfRequestWithClosestTimeCome]); + // find out free device bool wasFreeDevice = false; foreach (var device in devices) { if (!device.IsWorking) { - _deviceManager.TakeRequest(newRequestInSystem, device); + algorithm.deviceManager.TakeRequest(newRequestInSystem, device); wasFreeDevice = true; break; } @@ -133,7 +140,7 @@ private void FindNextSpecialEvent(List devices, List sources, IB if (!wasFreeDevice) { // Add request to buffer if no free devices were found - bufferManager.Add(newRequestInSystem); + algorithm.bufferManager.Add(newRequestInSystem); } } From e61da508ac542a5f9e5891e3ef6ebb27041a14aa Mon Sep 17 00:00:00 2001 From: NiceOneFox <53495952+NiceOneFox@users.noreply.github.com> Date: Mon, 2 May 2022 22:04:30 +0300 Subject: [PATCH 24/29] Update README.md --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 226fe9e..5b684b9 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ Input parameters: * Lambda for sources ## Technologies +### Backend - ASP .NET 6 - C# 10 - AutoMapper @@ -37,9 +38,14 @@ Input parameters: - NUnit - Moq +### Frontend +- Angular + ## Architecture N-Layer Web API ## Used Design Patterns 1. Factory Pattern (Concrete implementation is chosen by input parameter) -2. Dependency Injection (DI) +2. Builder Pattern (For constructing of algorithm) +3. Dependency Injection (DI) + From 9b88f2fd26b4007dfe4aac893c6e14714625597d Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Wed, 4 May 2022 22:30:17 +0300 Subject: [PATCH 25/29] remove and sort usings --- .../Configuration/ApiMapperConfigurator.cs | 2 +- .../Api/Controllers/Simulation.cs | 4 ++-- .../Api/Entities/ApiResults.cs | 4 +--- .../CustomExceptionHandlerMiddleware.cs | 4 ++-- backend/ServiceSimulation/Api/Program.cs | 2 +- .../Validation/InputParametersValidator.cs | 5 ++--- .../EntitiesTests/DeviceManagerTests.cs | 10 ++++----- .../Entities/PoissonianFlowProvider.cs | 5 ----- .../Bll.Domain/Interfaces/IFlowProvider.cs | 8 +------ .../Bll.Domain/Models/Request.cs | 2 +- .../Bll.Domain/Services/SimulationService.cs | 22 +++++++++---------- 11 files changed, 27 insertions(+), 41 deletions(-) diff --git a/backend/ServiceSimulation/Api/Configuration/ApiMapperConfigurator.cs b/backend/ServiceSimulation/Api/Configuration/ApiMapperConfigurator.cs index 32fc45e..a6c0425 100644 --- a/backend/ServiceSimulation/Api/Configuration/ApiMapperConfigurator.cs +++ b/backend/ServiceSimulation/Api/Configuration/ApiMapperConfigurator.cs @@ -1,7 +1,7 @@ using Api.Entities; using AutoMapper; -using Bll.Domain.Models; using Bll.Domain.Interfaces; +using Bll.Domain.Models; namespace Api.Configuration; diff --git a/backend/ServiceSimulation/Api/Controllers/Simulation.cs b/backend/ServiceSimulation/Api/Controllers/Simulation.cs index 2912a2f..30f63f6 100644 --- a/backend/ServiceSimulation/Api/Controllers/Simulation.cs +++ b/backend/ServiceSimulation/Api/Controllers/Simulation.cs @@ -16,8 +16,8 @@ public class Simulation : Controller private readonly IResults _results; private readonly IResultManager _resultManager; private readonly IMapper _mapper; - public Simulation(ISimulationService simulationService, - ITimeProvider time, + public Simulation(ISimulationService simulationService, + ITimeProvider time, IResults results, IResultManager resultManager, IMapper mapper) diff --git a/backend/ServiceSimulation/Api/Entities/ApiResults.cs b/backend/ServiceSimulation/Api/Entities/ApiResults.cs index cff888c..622adf0 100644 --- a/backend/ServiceSimulation/Api/Entities/ApiResults.cs +++ b/backend/ServiceSimulation/Api/Entities/ApiResults.cs @@ -1,6 +1,4 @@ -using Bll.Domain.Entities; - -namespace Api.Entities; +namespace Api.Entities; public record ApiResults { diff --git a/backend/ServiceSimulation/Api/Middlewares/CustomExceptionHandlerMiddleware.cs b/backend/ServiceSimulation/Api/Middlewares/CustomExceptionHandlerMiddleware.cs index 72b0bfd..3ddb481 100644 --- a/backend/ServiceSimulation/Api/Middlewares/CustomExceptionHandlerMiddleware.cs +++ b/backend/ServiceSimulation/Api/Middlewares/CustomExceptionHandlerMiddleware.cs @@ -1,6 +1,6 @@ -using System.Net; +using FluentValidation; +using System.Net; using System.Text.Json; -using FluentValidation; namespace Api.Middlewares { diff --git a/backend/ServiceSimulation/Api/Program.cs b/backend/ServiceSimulation/Api/Program.cs index 77ed923..9a722ae 100644 --- a/backend/ServiceSimulation/Api/Program.cs +++ b/backend/ServiceSimulation/Api/Program.cs @@ -14,7 +14,7 @@ builder.Services.AddControllers().AddFluentValidation(fv => { -fv.RegisterValidatorsFromAssemblyContaining(); + fv.RegisterValidatorsFromAssemblyContaining(); }); #region Logger diff --git a/backend/ServiceSimulation/Api/Validation/InputParametersValidator.cs b/backend/ServiceSimulation/Api/Validation/InputParametersValidator.cs index a5d3ad1..073f3d2 100644 --- a/backend/ServiceSimulation/Api/Validation/InputParametersValidator.cs +++ b/backend/ServiceSimulation/Api/Validation/InputParametersValidator.cs @@ -1,6 +1,5 @@ -using FluentValidation; -using Bll.Domain.Models; -using Api.enums; +using Bll.Domain.Models; +using FluentValidation; namespace Api.Validation { diff --git a/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs b/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs index 01739c3..ebfade7 100644 --- a/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs +++ b/backend/ServiceSimulation/Bll.Domain.Tests/EntitiesTests/DeviceManagerTests.cs @@ -1,11 +1,11 @@ -using System.Linq; +using Bll.Domain.Entities; using Bll.Domain.Interfaces; -using Bll.Domain.Entities; +using Bll.Domain.Models; using Moq; using NUnit.Framework; -using Bll.Domain.Models; -using System.Collections.Generic; using System; +using System.Collections.Generic; +using System.Linq; namespace Bll.Domain.Tests.EntitiesTests { @@ -105,7 +105,7 @@ public void FreeDevice_RequestOnDeviceIsNull_ThrowArgumentNullException() var deviceManager = new DeviceManager(_time.Object, _flow.Object, _results.Object); //Act //Assert - Assert.Throws (() => deviceManager.FreeDevice(device)); + Assert.Throws(() => deviceManager.FreeDevice(device)); } } } \ No newline at end of file diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/PoissonianFlowProvider.cs b/backend/ServiceSimulation/Bll.Domain/Entities/PoissonianFlowProvider.cs index b316161..aa35797 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/PoissonianFlowProvider.cs +++ b/backend/ServiceSimulation/Bll.Domain/Entities/PoissonianFlowProvider.cs @@ -1,9 +1,4 @@ using Bll.Domain.Interfaces; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Bll.Domain.Entities { diff --git a/backend/ServiceSimulation/Bll.Domain/Interfaces/IFlowProvider.cs b/backend/ServiceSimulation/Bll.Domain/Interfaces/IFlowProvider.cs index 7e19099..800b247 100644 --- a/backend/ServiceSimulation/Bll.Domain/Interfaces/IFlowProvider.cs +++ b/backend/ServiceSimulation/Bll.Domain/Interfaces/IFlowProvider.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Bll.Domain.Interfaces +namespace Bll.Domain.Interfaces { public interface IFlowProvider { diff --git a/backend/ServiceSimulation/Bll.Domain/Models/Request.cs b/backend/ServiceSimulation/Bll.Domain/Models/Request.cs index 7f54dcb..184aacc 100644 --- a/backend/ServiceSimulation/Bll.Domain/Models/Request.cs +++ b/backend/ServiceSimulation/Bll.Domain/Models/Request.cs @@ -6,7 +6,7 @@ public class Request public int SerialNumberOfSource { get; set; } public double StartTime { get; set; } public double? EndTime { get; set; } - + public Request(int numberOfSource, int serialNumberOfSource, double startTime, double? endTime) { NumberOfSource = numberOfSource; diff --git a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs index 3e50317..3b23926 100644 --- a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs +++ b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs @@ -1,6 +1,6 @@ -using Bll.Domain.Models; -using Bll.Domain.Factories; +using Bll.Domain.Factories; using Bll.Domain.Interfaces; +using Bll.Domain.Models; namespace Bll.Domain.Services; @@ -12,11 +12,11 @@ public class SimulationService : ISimulationService private readonly IDeviceDirectorFactory _deviceDirectorFactory; private readonly IResults _results; private readonly ITimeProvider _time; - public SimulationService(ISourceManager sourceManager, - IDeviceManager deviceManager, + public SimulationService(ISourceManager sourceManager, + IDeviceManager deviceManager, IBufferManagerFactory bufferManagerFactory, IDeviceDirectorFactory deviceDirectorFactory, - IResults results, + IResults results, ITimeProvider time) { _sourceManager = sourceManager; @@ -70,9 +70,9 @@ public void StartSimulation(InputParameters parameters) { if (_results.AmountOfGeneratedRequests >= parameters.AmountOfRequests && bufferManager.IsFree() && - IsAllDevicesFree(devices) || + IsAllDevicesFree(devices) || _time.Now >= parameters.ModelingTime) - // _results.AmountOfServedRequest == parameters.AmountOfRequests) // TODO CHECK FOR REQUESTS ON SOURCES. WHEN TO END SYSTEM MODELING + // _results.AmountOfServedRequest == parameters.AmountOfRequests) // TODO CHECK FOR REQUESTS ON SOURCES. WHEN TO END SYSTEM MODELING { break; } @@ -80,7 +80,7 @@ public void StartSimulation(InputParameters parameters) } } - private void FindNextSpecialEvent(List devices, List sources, IBufferManager bufferManager, + private void FindNextSpecialEvent(List devices, List sources, IBufferManager bufferManager, IDeviceDirector deviceDirector, InputParameters parameters) { double timeOfClosestRequestCome = double.MaxValue; @@ -89,7 +89,7 @@ private void FindNextSpecialEvent(List devices, List sources, IB int indexOfRequestWithClosestTimeCome = -1; for (int i = 0; i < sources.Count; i++) { - // if (_results.AmountOfGeneratedRequests >= parameters.AmountOfRequests) break; + // if (_results.AmountOfGeneratedRequests >= parameters.AmountOfRequests) break; if (sources[i].TimeOfNextRequest < timeOfClosestRequestCome) { timeOfClosestRequestCome = sources[i].TimeOfNextRequest; @@ -107,7 +107,7 @@ private void FindNextSpecialEvent(List devices, List sources, IB } } - if (timeOfClosestDeviceFree < timeOfClosestRequestCome + if (timeOfClosestDeviceFree < timeOfClosestRequestCome || _results.AmountOfGeneratedRequests == parameters.AmountOfRequests) { _deviceManager.FreeDevice(devices[indexOfDeviceWithClosestTimeFree]); @@ -129,7 +129,7 @@ private void FindNextSpecialEvent(List devices, List sources, IB if (freeDevice is not null) { _deviceManager.TakeRequest(newRequestInSystem, freeDevice); - } + } else { bufferManager.Add(newRequestInSystem); From 64da0be77e867d1ecdffb3434a8155695046b849 Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Wed, 4 May 2022 22:39:23 +0300 Subject: [PATCH 26/29] Add NullCheck in Builder --- .../Bll.Domain/Entities/AlgorithmBuilder.cs | 15 +++++++++++++++ .../Bll.Domain/Models/Algorithm.cs | 1 + .../Bll.Domain/Services/SimulationService.cs | 5 +++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/backend/ServiceSimulation/Bll.Domain/Entities/AlgorithmBuilder.cs b/backend/ServiceSimulation/Bll.Domain/Entities/AlgorithmBuilder.cs index 4a7da92..c6adc76 100644 --- a/backend/ServiceSimulation/Bll.Domain/Entities/AlgorithmBuilder.cs +++ b/backend/ServiceSimulation/Bll.Domain/Entities/AlgorithmBuilder.cs @@ -24,9 +24,24 @@ public AlgorithmBuilder WithBufferManager(IBufferManager bufferManager) return this; } + public AlgorithmBuilder WithDeviceDirector(IDeviceDirector deviceDirector) + { + _algorithm.deviceDirector = deviceDirector; + return this; + } + public Algorithm Build() { + Validation(); return _algorithm; } + + private void Validation() + { + _ = _algorithm.deviceManager ?? throw new ArgumentNullException("DeviceManager is not constructed in builder"); + _ = _algorithm.sourceManager ?? throw new ArgumentNullException("SourceManager is not constructed in builder"); + _ = _algorithm.bufferManager ?? throw new ArgumentNullException("BufferManager is not constructed in builder"); + _ = _algorithm.deviceDirector ?? throw new ArgumentNullException("DeviceDirector is not constructed in builder"); + } } } \ No newline at end of file diff --git a/backend/ServiceSimulation/Bll.Domain/Models/Algorithm.cs b/backend/ServiceSimulation/Bll.Domain/Models/Algorithm.cs index 5274ba6..0615bd3 100644 --- a/backend/ServiceSimulation/Bll.Domain/Models/Algorithm.cs +++ b/backend/ServiceSimulation/Bll.Domain/Models/Algorithm.cs @@ -7,5 +7,6 @@ public class Algorithm public ISourceManager sourceManager { get; set; } public IDeviceManager deviceManager { get; set; } public IBufferManager bufferManager { get; set; } + public IDeviceDirector deviceDirector { get; set; } } } diff --git a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs index 31963d0..e88e77d 100644 --- a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs +++ b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs @@ -1,4 +1,5 @@ -using Bll.Domain.Factories; +using Bll.Domain.Entities; +using Bll.Domain.Factories; using Bll.Domain.Interfaces; using Bll.Domain.Models; @@ -129,7 +130,7 @@ private void FindNextSpecialEvent(List devices, List sources, Al // find out free device - var freeDevice = deviceDirector.ChooseDevice(devices, _deviceManager); // init deviceDirector with devicemanager + var freeDevice = algorithm.deviceDirector.ChooseDevice(devices, _deviceManager); // init deviceDirector with devicemanager if (freeDevice is not null) { From 8b87a9c0321a5ef0e6272fdaf0aad623d03f1e80 Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Wed, 4 May 2022 22:44:58 +0300 Subject: [PATCH 27/29] Setup service --- backend/ServiceSimulation/Api/Program.cs | 1 + backend/ServiceSimulation/Bll.Domain/Models/InputParameters.cs | 2 ++ .../ServiceSimulation/Bll.Domain/Services/SimulationService.cs | 1 - .../Bll.Domain/enums/{SimulationType.cs => BufferType.cs} | 0 4 files changed, 3 insertions(+), 1 deletion(-) rename backend/ServiceSimulation/Bll.Domain/enums/{SimulationType.cs => BufferType.cs} (100%) diff --git a/backend/ServiceSimulation/Api/Program.cs b/backend/ServiceSimulation/Api/Program.cs index 9a722ae..fa39675 100644 --- a/backend/ServiceSimulation/Api/Program.cs +++ b/backend/ServiceSimulation/Api/Program.cs @@ -37,6 +37,7 @@ builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); +builder.Services.AddTransient(); builder.Services.AddTransient, InputParametersValidator>(); #endregion diff --git a/backend/ServiceSimulation/Bll.Domain/Models/InputParameters.cs b/backend/ServiceSimulation/Bll.Domain/Models/InputParameters.cs index 69e809a..712a184 100644 --- a/backend/ServiceSimulation/Bll.Domain/Models/InputParameters.cs +++ b/backend/ServiceSimulation/Bll.Domain/Models/InputParameters.cs @@ -1,4 +1,5 @@ using Api.enums; +using Bll.Domain.enums; namespace Bll.Domain.Models; @@ -10,6 +11,7 @@ public class InputParameters public int AmountOfRequests { get; set; } = 40; public double ModelingTime { get; set; } = double.MaxValue; public BufferType BufferType { get; set; } = BufferType.FIFO; + public DeviceDirectorType deviceDirectorType { get; set; } = DeviceDirectorType.Circle; public double LambdaForRequests { get; set; } = 3; public double LambdaForDevice { get; set; } = 3; } \ No newline at end of file diff --git a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs index e88e77d..23ab11a 100644 --- a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs +++ b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs @@ -129,7 +129,6 @@ private void FindNextSpecialEvent(List devices, List sources, Al var newRequestInSystem = algorithm.sourceManager.GetNewRequest(sources[indexOfRequestWithClosestTimeCome]); // find out free device - var freeDevice = algorithm.deviceDirector.ChooseDevice(devices, _deviceManager); // init deviceDirector with devicemanager if (freeDevice is not null) diff --git a/backend/ServiceSimulation/Bll.Domain/enums/SimulationType.cs b/backend/ServiceSimulation/Bll.Domain/enums/BufferType.cs similarity index 100% rename from backend/ServiceSimulation/Bll.Domain/enums/SimulationType.cs rename to backend/ServiceSimulation/Bll.Domain/enums/BufferType.cs From 3056cd514101e75125f5b3a33309f67695430f93 Mon Sep 17 00:00:00 2001 From: NiceOneFox Date: Wed, 4 May 2022 22:46:59 +0300 Subject: [PATCH 28/29] add to builder --- .../ServiceSimulation/Bll.Domain/Services/SimulationService.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs index 23ab11a..a6c65d0 100644 --- a/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs +++ b/backend/ServiceSimulation/Bll.Domain/Services/SimulationService.cs @@ -59,11 +59,13 @@ public Task StartSimulationAsync(InputParameters parameters) } var bufferManager = _bufferManagerFactory.CreateBufferManager(parameters.BufferType, parameters.BufferSize); + var deviceDirector = _deviceDirectorFactory.CreateDeviceDirector(parameters.deviceDirectorType); var algorithm = new AlgorithmBuilder() .WithBufferManager(bufferManager) .WithSourceManager(_sourceManager) .WithDeviceManager(_deviceManager) + .WithDeviceDirector(deviceDirector) .Build(); foreach (var source in sources) // Generate first requests that generated by sources. From 25f84c8630fc8fa8836a12ec770215e245534044 Mon Sep 17 00:00:00 2001 From: NiceOneFox <53495952+NiceOneFox@users.noreply.github.com> Date: Wed, 4 May 2022 22:50:01 +0300 Subject: [PATCH 29/29] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5b684b9..7253a43 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,8 @@ Input parameters: * Buffer capacity * Amount of requests * Modeling time (max time) -* SimulationType (Type of buffer modeling, FIFO, LIFO etc.) +* BufferType (Type of buffer modeling, FIFO, LIFO etc.) +* DeviceDirector (Type of choosing free device, circle etc.) * Lambda for devices (amount of flow) parameter for Poissonian flow * Lambda for sources pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy