Browse Source

initial commit

master
Serg A. Verevkin 10 months ago
commit
211b372219
  1. 3
      .gitignore
  2. 60
      Controllers/Field2Controller.cs
  3. 53
      Controllers/FieldController.cs
  4. 39
      Controllers/WeatherForecastController.cs
  5. 19
      Model/Field.cs
  6. 34
      Model/FieldManager.cs
  7. 10
      Model/Figure.cs
  8. 41
      Model/FigureMover.cs
  9. 9
      Model/IFieldManager.cs
  10. 22
      Model/RandomField.cs
  11. 28
      Program.cs
  12. 30
      Properties/launchSettings.json
  13. 62
      Startup.cs
  14. 11
      TextFile.md
  15. 15
      WeatherForecast.cs
  16. 11
      WebApplication1.csproj
  17. 7
      WebApplication1.csproj.user
  18. 31
      WebApplication1.sln
  19. 9
      appsettings.Development.json
  20. 10
      appsettings.json

3
.gitignore

@ -0,0 +1,3 @@
bin/
obj/
.vs/

60
Controllers/Field2Controller.cs

@ -0,0 +1,60 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace WebApplication1.Controllers
{
[Route("api/v2/[controller]")]
[ApiController]
public class Field2Controller : ControllerBase
{
private IFieldManager _fm;
private ILogger<FieldController> _lg;
/// <summary>
/// .ctor
/// </summary>
/// <param name="fm"></param>
public Field2Controller(
IFieldManager fm,
ILogger<FieldController> lg)
{
_fm = fm;
_lg = lg;
}
[HttpPost(Name = "new")]
[Route("new")]
public Field StartNewGame()
{
return _fm.StartNewGame();
}
[HttpPost(Name = "move")]
[Route("move")]
public Field Move(string identifier)
{
return _fm.Move(identifier);
}
[HttpPost(Name = "move2")]
[Route("move2")]
public Field Move2(string identifier)
{
return _fm.Move(identifier);
}
[HttpGet(Name = "list")]
[Route("list")]
public Field List(string identifier)
{
return _fm.List(identifier);
}
}
}

53
Controllers/FieldController.cs

@ -0,0 +1,53 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace WebApplication1.Controllers
{
[Route("api/v1/[controller]")]
[ApiController]
public class FieldController : ControllerBase
{
private IFieldManager _fm;
private ILogger<FieldController> _lg;
/// <summary>
/// .ctor
/// </summary>
/// <param name="fm"></param>
public FieldController(
IFieldManager fm,
ILogger<FieldController> lg)
{
_fm = fm;
_lg = lg;
}
[HttpPost(Name = "new")]
[Route("new")]
public Field StartNewGame()
{
return _fm.StartNewGame();
}
[HttpPost(Name = "move")]
[Route("move")]
public Field Move(string identifier)
{
return _fm.Move(identifier);
}
[HttpGet(Name = "list")]
[Route("list")]
public Field List(string identifier)
{
return _fm.List(identifier);
}
}
}

39
Controllers/WeatherForecastController.cs

@ -0,0 +1,39 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace WebApplication1.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
SummaryWeather = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
}

19
Model/Field.cs

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace WebApplication1
{
public class Field
{
public string identifier { get; } = Guid.NewGuid().ToString("N");
public List<Figure> Figures { get; } = new List<Figure>();
public bool MoveRandomFigure()
{
Random rr = new Random();
int iPos = rr.Next(Figures.Count());
return FigureMover.Move(Figures[iPos]);
}
}
}

34
Model/FieldManager.cs

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace WebApplication1
{
public class FieldManager : IFieldManager
{
private List<Field> _fields = new List<Field>();
public Field StartNewGame()
{
var ff = new RandomField(2);
_fields.Add(ff);
return ff;
}
public Field Move(string identifier)
{
var ff = _fields.FirstOrDefault(f => f.identifier.Equals(identifier));
if (ff == null) return null;
ff.MoveRandomFigure();
return ff;
}
public Field List(string identifier)
{
var ff = _fields.FirstOrDefault(f => f.identifier.Equals(identifier));
if (ff == null) return null;
return ff;
}
}
}

10
Model/Figure.cs

@ -0,0 +1,10 @@
namespace WebApplication1
{
public class Figure
{
public int FigureColor { get; set; }
public int FigureType { get; set; }
public int PosX { get; set; }
public int PosY { get; set; }
}
}

41
Model/FigureMover.cs

@ -0,0 +1,41 @@
namespace WebApplication1
{
public static class FigureMover
{
public static readonly int FieldYMin = 0;
public static readonly int FieldYMax = 7;
public static readonly int FieldXMin = 0;
public static readonly int FieldXMax = 7;
public static bool Move(Figure figure)
{
if (figure.FigureType == 1)
{
return h_MoveSimple(figure);
}
return false;
}
private static bool h_MoveSimple(Figure figure)
{
bool bDirectionUp = false;
if (figure.FigureColor == 1)
{
bDirectionUp = true;
}
int iInc = bDirectionUp ? 1 : -1;
figure.PosY += iInc;
if (figure.PosY < FieldYMin)
{
figure.PosY = FieldYMin;
return false;
}
if (figure.PosY > FieldYMax)
{
figure.PosY = FieldYMax;
return false;
}
return true;
}
}
}

9
Model/IFieldManager.cs

@ -0,0 +1,9 @@
namespace WebApplication1
{
public interface IFieldManager
{
public Field StartNewGame();
Field Move(string identifier);
Field List(string identifier);
}
}

22
Model/RandomField.cs

@ -0,0 +1,22 @@
using System;
namespace WebApplication1
{
public class RandomField : Field
{
public RandomField(int iCount)
{
Random rr = new Random();
for (int ii = 0; ii < iCount; ii++)
{
this.Figures.Add(new Figure()
{
FigureColor = rr.Next(2),
FigureType = rr.Next(1),
PosX = rr.Next(FigureMover.FieldXMin, FigureMover.FieldXMax),
PosY = rr.Next(FigureMover.FieldYMin, FigureMover.FieldYMax),
});
}
}
}
}

28
Program.cs

@ -0,0 +1,28 @@
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace WebApplication1
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args)
.Build()
.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}

30
Properties/launchSettings.json

@ -0,0 +1,30 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:49746"
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WebApplication1": {
"commandName": "Project",
"dotnetRunMessages": "true",
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

62
Startup.cs

@ -0,0 +1,62 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.OpenApi.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace WebApplication1
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSingleton<IFieldManager>(new FieldManager());
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApplication1", Version = "v1" });
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "WebApplication1 v1"));
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}

11
TextFile.md

@ -0,0 +1,11 @@
# Задача
Продемонстрировать работающий сервис с реализацией логики вне контроллера
# Алгоритм решения задачи
- Создать пустое веб-апи сервис на основе шаблона
- Создать класс, осуществляющий прогноз погоды на следующий день по предыдущему
- Встроить класс в сервисную коллекцию (Singleton)
- Получить класс через Dependency Injection (конструктор)
- Использовать класс для выдачи результата
-- SET PATH=%PATH%;"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin"

15
WeatherForecast.cs

@ -0,0 +1,15 @@
using System;
namespace WebApplication1
{
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
public string SummaryWeather { get; set; }
}
}

11
WebApplication1.csproj

@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" />
</ItemGroup>
</Project>

7
WebApplication1.csproj.user

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Controller_SelectedScaffolderID>ApiControllerEmptyScaffolder</Controller_SelectedScaffolderID>
<Controller_SelectedScaffolderCategoryPath>root/Common/Api</Controller_SelectedScaffolderCategoryPath>
</PropertyGroup>
</Project>

31
WebApplication1.sln

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30709.132
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApplication1", "WebApplication1.csproj", "{1E41DB1E-938D-4030-B8C7-B90C64A7B6CC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp2", "..\ConsoleApp2\ConsoleApp2.csproj", "{95D5C921-BDC7-4A88-AAAD-EF09B81221EF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1E41DB1E-938D-4030-B8C7-B90C64A7B6CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1E41DB1E-938D-4030-B8C7-B90C64A7B6CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1E41DB1E-938D-4030-B8C7-B90C64A7B6CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1E41DB1E-938D-4030-B8C7-B90C64A7B6CC}.Release|Any CPU.Build.0 = Release|Any CPU
{95D5C921-BDC7-4A88-AAAD-EF09B81221EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{95D5C921-BDC7-4A88-AAAD-EF09B81221EF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{95D5C921-BDC7-4A88-AAAD-EF09B81221EF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{95D5C921-BDC7-4A88-AAAD-EF09B81221EF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {F485B05F-F662-4D8B-8E28-EB57AA152B44}
EndGlobalSection
EndGlobal

9
appsettings.Development.json

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}

10
appsettings.json

@ -0,0 +1,10 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Loading…
Cancel
Save