web-dev-qa-db-fra.com

Comment arrêter la boucle d'auto-référencement dans .Net Core Web API?

J'ai des problèmes qui, je suppose, sont liés à l'auto-référencement à l'aide de l'API Web .NET Core et d'Entity Framework Core. Mon API Web commence à s'étouffer lorsque j'ai ajouté. Comprend certaines propriétés de navigation.

J'ai trouvé ce qui semble être une solution dans l'ancienne API Web, mais je ne sais pas comment implémenter la même chose pour l'API Web .NET Core (j'en suis encore aux premiers stades d'apprentissage).

L'ancienne solution collait cela dans Application_Start () du Global.asax:

 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;

Je soupçonne que cela est géré dans la méthode ConfigureService () du démarrage, mais je ne sais pas grand-chose là-bas.

Ou existe-t-il un moyen plus approprié de gérer ce problème?

19
Sailing Judo

D'accord ... J'ai finalement trouvé du matériel de référence à ce sujet. La solution est:

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddMvc()
        .AddJsonOptions(
            options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        );

    ...
}

Je l'ai obtenu de ici

39
Sailing Judo

ReferenceLoopHandling.Ignore "cache" le problème, pas le résout. Ce que vous devez vraiment faire, c'est créer des couches. Créez des objets de domaine pour vous asseoir sur vos entités et enveloppez-les dans une sorte de couche service/entreprise. Recherchez le modèle de référentiel et appliquez-le si cela vous aide. Vous devrez mapper entre vos entités et les objets de domaine, ce qui vous donne la possibilité de tenir dans une sorte de mappeur (automappeur) et de couche de validation.

Si vos objets et entités de domaine sont exactement les mêmes, vous devez réfléchir davantage à ce que vous faites.

Par exemple: vos entités ont-elles des suppressions progressives? (IsDeleted) flag? Si tel est le cas, cela n'a pas nécessairement besoin d'être renvoyé au client sur le Web, c'est donc un exemple parfait de la différence.

Quoi qu'il en soit, la réponse est de ne pas le remplacer dans JSON, c'est de changer votre architecture.

4
Robert Perry