Skip to content

Instantly share code, notes, and snippets.

@ZlobnyiSerg
Last active February 2, 2022 22:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ZlobnyiSerg/45145d9140f1d58def4a696cc7483a08 to your computer and use it in GitHub Desktop.
Save ZlobnyiSerg/45145d9140f1d58def4a696cc7483a08 to your computer and use it in GitHub Desktop.
using System.ComponentModel.DataAnnotations;
using System.Net;
using AutoMapper;
using AutoMapper.QueryableExtensions;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSwaggerGen();
builder.Services.AddControllers();
builder.Services.AddDbContext<TodoDbContext>(cfg => cfg.UseInMemoryDatabase("DbName"));
builder.Services.AddAutoMapper(typeof(TodoModel).Assembly);
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
app.MapControllers();
app.Run();
public class TodoModel // Slim DTO for http transfer
{
public int Id { get; set; }
public string TaskName { get; set; }
}
public class TodoModelMappingProfile : Profile // This class define how to map object of type Todo to object of type TodoModel
{
public TodoModelMappingProfile()
{
CreateMap<Todo, TodoModel>()
.ForMember(t => t.TaskName, opt => opt.MapFrom(t => t.Name)); // We tell that TaskName should be taken from Name column
}
}
public class Todo // Entity & model at the same time
{
[Key] public int Id { get; set; }
[Required] [MaxLength(128)] public string Name { get; set; }
public bool Completed { get; set; }
}
public class TodoDbContext : DbContext // Database information - what models should be tables and so on
{
public DbSet<Todo> Todos { get; set; }
public TodoDbContext(DbContextOptions options) : base(options)
{
}
}
[ApiController]
public class TodoController : Controller // Endpoint to process http requests
{
private readonly TodoDbContext _dbContext;
private readonly IMapper _mapper;
public TodoController(TodoDbContext dbContext, IMapper mapper)
{
_dbContext = dbContext;
_mapper = mapper;
}
[HttpGet]
[Route("todos/{id}")]
[ProducesResponseType(typeof(TodoModel), (int)HttpStatusCode.OK)]
public async Task<IActionResult> Get(int id, CancellationToken token)
{
var todo = await _dbContext.Todos.ProjectTo<TodoModel>(_mapper.ConfigurationProvider).FirstOrDefaultAsync(t => t.Id == id, token);
return todo == null ? NotFound() : Ok(todo);
}
[HttpPost]
[Route("todos")]
[ProducesResponseType(typeof(Todo), (int)HttpStatusCode.OK)]
public async Task<IActionResult> Create(Todo request, CancellationToken token)
{
await _dbContext.Todos.AddAsync(request, token);
await _dbContext.SaveChangesAsync(token);
return Ok(request);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment