Wie zu stoppen self-referencing-Schleife in .Net-Core-Web-API?
Ich habe einige Fragen, die ich vermute, sind im Zusammenhang mit selbst-Referenzierung verwenden .NET-Core-Web-API und Entity Framework-Kern. Meine Web-API ab Würgen, wenn ich Hinzugefügt .Enthält für einige Navigations-Eigenschaften.
Habe ich gefunden, was zu sein scheint eine Lösung in ältere Web-API, aber ich weiß nicht, wie zu implementieren, die gleiche Sache für .NET-Core-Web-API (ich bin immer noch in der early learning Phasen).
Die ältere Lösung, steckte diese in der Application_Start() des Globalen.asax:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
Ich vermute, dies erfolgt in der StartUp ist ConfigureService () - Methode, aber ich weiß nicht viel über es.
Oder gibt es eine angemessenere Art und Weise zu handhaben Sie dieses Problem?
- Generell kann ich mit API-Objekten, die nicht über die kreisförmigen Schleifen (nicht die gerade EF-Objekte)
- ich bin damit einverstanden, ordnen Sie Ihre DB-Draht-Objekte, API-Aufrufer konzentriert. Die DB über einen Draht ist ein anti-pattern für die software-Entwicklung (ironischerweise ist es eine goto-Lösung für so viele Menschen "zu tun, RUHE")
- Es scheint, dass gegen das DRY-Prinzip, da mein Draht-Modelle würden genauso Aussehen wie meine, die Modelle sind bevölkert von EF.
- Die eigentliche Frage ist, sollte Sie? Allgemein API-Objekte können sehr viel flacher als diejenigen, die für eine relationale Datenbank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Okay... schließlich fand ich einige Referenz material auf dieser. Die Lösung ist:
Ich habe diese aus hier
ReferenceLoopHandling.Ignorieren "versteckt", die das problem nicht löst. Was Sie wirklich tun müssen, ist ein Bau-Schichten. Erstellen Sie domain-Objekte zu sitzen oben auf Ihre Entitäten und wickeln Sie Sie in irgendeine Art von service/business-Schicht. Suchen Sie das repository-pattern und anwenden, dass, wenn es hilft. Sie müssen die Zuordnung zwischen den Entitäten und Domänen-Objekten, und dies gibt Ihnen die Möglichkeit zu passen, in irgendeiner Art von mapper (automapper) und Validierung Ebene..
Wenn Ihr domain-Objekten und Entitäten sind genau die gleichen, dann müssen Sie denken, mehr über das, was Ihr tut.
Zum Beispiel: Machen Sie Ihre Einheiten haben soft löscht? (IsDeleted -) fahne? Wenn ja, ist dies nicht unbedingt brauchen, um zurück zu gehen, um den client über das web, also das ist ein perfektes Beispiel, wo Sie anders sein würde.
So oder so, die Antwort ist nicht, um es zu überschreiben, die in JSON, es zu ändern Ihre Architektur..
Wenn Sie ASP.NET Core 3.0, und die Erfahrung, dass problem ist, bitte installieren Sie das NuGET-Paket: Microsoft.AspNetCore.Mvc.NewtonsoftJson 3.0.0.
Zu ersetzen, die das neue System.Text.Json, die nicht noch haben die Referenz-Loop-Handling dazu in den Autostart.cs, stellen Sie sicher, dass in der ConfigureServices, enthalten ist:
Wenn Sie die neuesten .Net Core 3.0 Art und Weise:
oder die alte Weise: