Posiadam poniższy kontroler:
[Route("api/[controller]")]
public class RecipesController : ControllerBase
{
private readonly IRecipeQuery _recipeQuery;
private readonly IRecipeService _recipeService;
public RecipesController(IRecipeQuery recipeQuery, IRecipeService recipeService)
{
_recipeQuery = recipeQuery;
_recipeService = recipeService;
}
[HttpGet]
public async Task<IActionResult> GetAll()
{
return Ok(await _recipeQuery.GetAllAsync());
}
[HttpGet("{id}")]
public async Task<IActionResult> Get(Guid id)
{
return Ok(await _recipeQuery.GetAsync(id));
}
[HttpPost]
public async Task<IActionResult> Add([FromBody] RecipeModel model)
{
await _recipeService.AddAsync(model);
return CreatedAtAction("Get", new {id = model.Id}, model);
}
}
W endpoincie POST zwracam status 201 Created
z lokacją do nowo utworzonego obiektu. Czy sposób wykonania tego jest prawidłowy? Ponadto myślałem w jaki sposób najlepiej jest przekazywać te nowo utworzone ID z bazy danych (EF generuje klucz). Zrobiłem to w serwisie RecipeService
następująco:
public class RecipeService : IRecipeService
{
private readonly ShoppingListDbContext _shoppingListDbContext;
private readonly IMapper _mapper;
public RecipeService(ShoppingListDbContext shoppingListDbContext, IMapper mapper)
{
_shoppingListDbContext = shoppingListDbContext;
_mapper = mapper;
}
public async Task AddAsync(RecipeModel model)
{
var recipe = _mapper.Map<Recipe>(model);
_shoppingListDbContext.Recipes.Add(recipe);
await _shoppingListDbContext.SaveChangesAsync();
model.Id = recipe.Id;
}
}
Czy przepisanie ID można zrobić jakoś ładniej, niż na sztywno przepisywać do modelu wartość z encji po jej zapisie i utworzeniu nowego ID?