/// <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; }
/// <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); }
/// <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(); }
/// <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(); }