Exemplo n.º 1
0
        /// <inheritdoc />
        public async Task Execute(IJobExecutionContext context)
        {
            _logger.LogInformation("Dakar Rally simulation started!");

            await Task.Delay(3000);

            while (!context.CancellationToken.IsCancellationRequested)
            {
                _logger.LogInformation("Dakar Rally simulator background service is doing background work.");

                using IServiceScope scope = _serviceProvider.CreateScope();

                DakarRallyDbContext dbContext = scope.ServiceProvider.GetRequiredService <DakarRallyDbContext>();

                var race = await dbContext.Set <Race>()
                           .SingleOrDefaultAsync(x => x.Status == RaceStatus.Running, context.CancellationToken);

                if (race != null)
                {
                    await SimulateOneHour(race, dbContext);
                }

                await Task.Delay(2000);
            }
            _logger.LogInformation("Dakar Rally simulation finished!");

            await Task.CompletedTask;
        }
Exemplo n.º 2
0
        /// <summary>
        /// Ensures that the in-memory database is created.
        /// </summary>
        /// <param name="builder">The application builder.</param>
        /// <returns>The same application builder.</returns>
        internal static IApplicationBuilder EnsureDatabaseCreated(this IApplicationBuilder builder)
        {
            using IServiceScope serviceScope = builder.ApplicationServices.CreateScope();

            using DakarRallyDbContext dbContext = serviceScope.ServiceProvider.GetRequiredService <DakarRallyDbContext>();

            dbContext.Database.EnsureCreated();

            dbContext.SeedDatabase();

            return(builder);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Simulates one hour of race time.
        /// </summary>
        /// <param name="race">The race that is currently running.</param>
        /// <param name="dbContext">The database context.</param>
        private async Task SimulateOneHour(Race race, DakarRallyDbContext dbContext)
        {
            List <Vehicle> vehicles = await dbContext.Set <Vehicle>()
                                      .Include(x => x.RepairmentLength)
                                      .Include(x => x.Speed)
                                      .Include(x => x.MalfunctionProbability)
                                      .Include(x => x.Malfunctions)
                                      .Where(x => x.RaceId == race.Id)
                                      .ToListAsync();

            VehicleStatus[] completeStatuses = { VehicleStatus.Broken, VehicleStatus.CompletedRace };

            using IServiceScope scope = _serviceProvider.CreateScope();

            RacesService _raceService = scope.ServiceProvider.GetRequiredService <RacesService>();

            await _raceService.SimulateRaceHour(race, vehicles);

            if (vehicles.All(x => completeStatuses.Contains(x.Status)))
            {
                await _raceService.CompleteRace(race);
            }
            await dbContext.SaveChangesAsync();
        }
Exemplo n.º 4
0
        /// <summary>
        /// Seeds the database with initial data.
        /// </summary>
        /// <param name="dbContext">The database context.</param>
        public static void SeedDatabase(this DakarRallyDbContext dbContext)
        {
            dbContext.Set <VehicleTypeRepairmentLength>().AddRange(new List <VehicleTypeRepairmentLength>
            {
                new VehicleTypeRepairmentLength()
                {
                    Id = (int)VehicleType.Truck,
                    RepairmentLengthInHours = 7,
                    CreatedOnUtc            = DateTime.UtcNow
                },
                new VehicleTypeRepairmentLength()
                {
                    Id = (int)VehicleType.Car,
                    RepairmentLengthInHours = 5,
                    CreatedOnUtc            = DateTime.UtcNow
                },
                new VehicleTypeRepairmentLength()
                {
                    Id = (int)VehicleType.Motorcycle,
                    RepairmentLengthInHours = 3,
                    CreatedOnUtc            = DateTime.UtcNow
                },
            });

            dbContext.Set <VehicleSubtypeSpeed>().AddRange(new List <VehicleSubtypeSpeed>
            {
                new VehicleSubtypeSpeed()
                {
                    Id = (int)VehicleSubtype.Truck,
                    SpeedInKilometersPerHour = 80,
                    CreatedOnUtc             = DateTime.UtcNow
                },
                new VehicleSubtypeSpeed()
                {
                    Id = (int)VehicleSubtype.TerrainCar,
                    SpeedInKilometersPerHour = 100,
                    CreatedOnUtc             = DateTime.UtcNow
                },
                new VehicleSubtypeSpeed()
                {
                    Id = (int)VehicleSubtype.SportsCar,
                    SpeedInKilometersPerHour = 140,
                    CreatedOnUtc             = DateTime.UtcNow
                },
                new VehicleSubtypeSpeed()
                {
                    Id = (int)VehicleSubtype.CrossMotorcycle,
                    SpeedInKilometersPerHour = 85,
                    CreatedOnUtc             = DateTime.UtcNow
                },
                new VehicleSubtypeSpeed()
                {
                    Id = (int)VehicleSubtype.SportMotorcycle,
                    SpeedInKilometersPerHour = 130,
                    CreatedOnUtc             = DateTime.UtcNow
                },
            });

            dbContext.Set <VehicleSubtypeMalfunctionProbability>().AddRange(new List <VehicleSubtypeMalfunctionProbability>
            {
                new VehicleSubtypeMalfunctionProbability()
                {
                    Id = (int)VehicleSubtype.Truck,
                    LightMalfunctionProbability = 0.06m,
                    HeavyMalfunctionProbability = 0.04m
                },
                new VehicleSubtypeMalfunctionProbability()
                {
                    Id = (int)VehicleSubtype.TerrainCar,
                    LightMalfunctionProbability = 0.03m,
                    HeavyMalfunctionProbability = 0.01m,
                },
                new VehicleSubtypeMalfunctionProbability()
                {
                    Id = (int)VehicleSubtype.SportsCar,
                    LightMalfunctionProbability = 0.12m,
                    HeavyMalfunctionProbability = 0.02m,
                },
                new VehicleSubtypeMalfunctionProbability()
                {
                    Id = (int)VehicleSubtype.CrossMotorcycle,
                    LightMalfunctionProbability = 0.03m,
                    HeavyMalfunctionProbability = 0.02m,
                },
                new VehicleSubtypeMalfunctionProbability()
                {
                    Id = (int)VehicleSubtype.SportMotorcycle,
                    LightMalfunctionProbability = 0.06m,
                    HeavyMalfunctionProbability = 0.04m,
                },
            });

            dbContext.SaveChanges();
        }