7 votes

PATCH lorsqu'on travaille avec des DTO

Je travaille sur asp.net core webAPI et EF core, et je veux implémenter l'opération "mise à jour" (modification partielle de l'entité). J'ai cherché la bonne façon de traiter cela, et j'ai vu que je devrais utiliser jsonPatch. Le problème c'est que j'expose uniquement des DTO à travers mon API, et si j'utilise jsonPatch comme:

public AccountDto Patch(int id, [FromBody]JsonPatchDocument patch)

alors je dois appliquer le patch sur le DTO, et je ne peux pas l'appliquer sur l'entité du modèle, sans créer une nouvelle entité.

J'ai aussi lu à propos de Odata.Delta, mais cela ne fonctionne toujours pas sur asp.net core, et en plus - je ne pense pas qu'il ait une solution intégrée pour travailler avec des DTO (j'ai trouvé cet exemple qui peut aider lorsque Odata pour core sera disponible)

Alors, pour l'instant - devrais-je utiliser POST et envoyer un DTO avec une liste de propriétés modifiées dans la requête (comme je l'ai vu ici), Ou - y a-t-il une solution plus élégante?

Merci!

3voto

arielorvits Points 1130

Maintenant, j'ai vu qu'en utilisant autoMapper je peux simplement

CreateMap, JsonPatchDocument>();
        CreateMap, Operation>();

et ça marche comme un charme :)

0voto

arielorvits Points 1130

En fin de compte,

J'ai simplement enlevé le type de JsonPatchDocument, et j'ai vu que cela peut fonctionner sans type...

[HttpPatch("{id}")]
    public AccountDTO Patch(int id, [FromBody]JsonPatchDocument patch)
    {
        return _mapper.Map(_accountBlService.EditAccount(id, patch));
    }

Et ensuite, dans la couche BL,

public Account EditAccount(int id, JsonPatchDocument patch)
    {
        var account = _context.Accounts.Single(a => a.AccountId == id);
        var uneditablePaths = new List { "/accountId" };

        if (patch.Operations.Any(operation => uneditablePaths.Contains(operation.path)))
        {
            throw new UnauthorizedAccessException();
        }
        patch.ApplyTo(account);            
        return account;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X