Skip to content

Commit af1fa7c

Browse files
authored
Merge pull request #10 from NiceOneFox/develop
Sprint 1
2 parents 589f110 + f038c6d commit af1fa7c

25 files changed

+527
-30
lines changed

README.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,15 @@
11
# ServiceSimulationSystem
2-
2+
3+
Project aim is build service simulation system that has flow of requests which are created by sources. Requests is taken by devices on work, if they are no free devices requests go in buffer, also if new requests haven't come we take requests from buffer.
4+
5+
6+
## Technologies
7+
- ASP .NET 6
8+
- C# 10
9+
10+
## Architecture
11+
N-Layer Web API
12+
13+
## Used Design Patterns
14+
1. Factory Pattern (Concrete implementation chosen by input parameter and provided by IoC)
15+
2. Dependency Injection (DI)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net6.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
</PropertyGroup>
8+
9+
</Project>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using Api.enums;
2+
using Bll.Domain.Factories;
3+
using Bll.Domain.Interfaces;
4+
5+
namespace Bll.Domain.Entities;
6+
7+
public class BufferManagerFactory : IBufferManagerFactory
8+
{
9+
private readonly IServiceProvider serviceProvider;
10+
11+
public BufferManagerFactory(IServiceProvider serviceProvider)
12+
{
13+
this.serviceProvider = serviceProvider;
14+
}
15+
16+
public IBufferManager CreateBufferManager(SimulationType simulationType)
17+
{
18+
return simulationType switch
19+
{
20+
0 => (IBufferManager)serviceProvider.GetService(typeof(StandardBufferManager)),
21+
_ => throw new NotImplementedException()
22+
};
23+
}
24+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace Bll.Domain.Entities;
2+
3+
public class Device
4+
{
5+
public int DeviceId { get; set; }
6+
public bool IsWorking { get; set; }
7+
public Request? Request { get; set; }
8+
public double Lambda { get; set; } = 5;
9+
public double TimeOfDeviceWillBeFree { get; set; } = 0;
10+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using Bll.Domain.Interfaces;
2+
3+
namespace Bll.Domain.Entities;
4+
5+
public class DeviceManager : IDeviceManager
6+
{
7+
private readonly ITimeProvider _time;
8+
9+
private readonly IResults _resultChannel;
10+
11+
private static readonly Random _random = new();
12+
13+
public DeviceManager(ITimeProvider time, IResults resultChannel)
14+
{
15+
_time = time;
16+
_resultChannel = resultChannel;
17+
}
18+
19+
public void TakeRequest(Request request, Device device)
20+
{
21+
if (device.IsWorking)
22+
{
23+
return;
24+
}
25+
device.Request = request;
26+
device.IsWorking = true;
27+
28+
device.TimeOfDeviceWillBeFree = _time.Now + (-1.0 / device.Lambda) * Math.Log(_random.NextDouble());
29+
}
30+
31+
public bool FreeDevice(Device device)
32+
{
33+
device.Request.EndTime = _time.Now;
34+
35+
_time.Now = device.Request.EndTime;
36+
37+
_resultChannel.Processed.Add(device.Request);
38+
39+
40+
device.Request = null;
41+
device.IsWorking = false;
42+
43+
return true;
44+
}
45+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using Api.enums;
2+
3+
namespace Bll.Domain.Entities;
4+
5+
public class InputParameters
6+
{
7+
public int NumberOfSources { get; set; } = 3;
8+
public int NumberOfDevices { get; set; } = 2;
9+
public int BufferSize { get; set; } = 2;
10+
public int AmountOfRequests { get; set; } = 40;
11+
public double ModelingTime { get; set; } = double.MaxValue;
12+
public SimulationType SimulationType { get; set; } = SimulationType.Standard;
13+
14+
public double Lambda { get; set; } = 3;
15+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace Bll.Domain.Entities;
2+
3+
public class Request
4+
{
5+
public int NumberOfSource { get; set; }
6+
public int SerialNumberOfSource { get; set; }
7+
public double StartTime { get; set; }
8+
public double EndTime { get; set; }
9+
10+
public Request(int numberOfSource, int serialNumberOfSource, double startTime, double endTime)
11+
{
12+
NumberOfSource = numberOfSource;
13+
SerialNumberOfSource = serialNumberOfSource;
14+
StartTime = startTime;
15+
EndTime = endTime;
16+
}
17+
18+
public override string ToString()
19+
=> "Time: " + StartTime + " №sourceManager: " + NumberOfSource + "-" + SerialNumberOfSource;
20+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using Bll.Domain.Interfaces;
2+
3+
namespace Bll.Domain.Entities;
4+
5+
public class Results : IResults
6+
{
7+
public List<Request> Cancelled { get; set; } = new();
8+
public List<Request> Processed { get; set; } = new();
9+
public double ModelingTime { get; set; }
10+
public int AmountOfGeneratedRequests { get; set; }
11+
public int AmountOfServedRequest
12+
{
13+
get => Cancelled.Count + Processed.Count;
14+
set { }
15+
}
16+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace Bll.Domain.Entities;
2+
3+
public class Source
4+
{
5+
public int SourceId { get; set; }
6+
public int Priority { get; set; }
7+
public int SerialNumber { get; set; }
8+
public double TimeOfNextRequest { get; set; }
9+
public double Lambda { get; set; } = 5;
10+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using Bll.Domain.Interfaces;
2+
3+
namespace Bll.Domain.Entities;
4+
5+
public class SourceManager : ISourceManager
6+
{
7+
private readonly ITimeProvider _time;
8+
9+
private readonly IResults _results;
10+
11+
private static Random _random = new();
12+
13+
public SourceManager(ITimeProvider time, IResults results)
14+
{
15+
_time = time;
16+
_results = results;
17+
}
18+
19+
public Request GetNewRequest(Source source)
20+
{
21+
var generatedRequest = new Request(source.SourceId, source.SerialNumber, source.TimeOfNextRequest, -1);
22+
23+
source.TimeOfNextRequest += -(1.0 / source.Lambda) * Math.Log(_random.NextDouble());
24+
source.SerialNumber++;
25+
generatedRequest.SerialNumberOfSource = source.SerialNumber; // TODO REFACTOR?
26+
27+
_time.Now = source.TimeOfNextRequest;
28+
_results.AmountOfGeneratedRequests++;
29+
30+
return generatedRequest;
31+
}
32+
}

0 commit comments

Comments
 (0)