{"id":14569,"date":"2021-12-02T11:55:55","date_gmt":"2021-12-02T10:55:55","guid":{"rendered":"https:\/\/www.centigrade.de\/blog\/14534\/"},"modified":"2022-02-24T09:06:43","modified_gmt":"2022-02-24T08:06:43","slug":"wie-man-graphql-net-und-react-miteinander-verbindet-teil-i","status":"publish","type":"blog","link":"https:\/\/www.centigrade.de\/de\/blog\/wie-man-graphql-net-und-react-miteinander-verbindet-teil-i\/","title":{"rendered":"GraphQL, .Net und React miteinander verbinden &#8211; Teil I."},"content":{"rendered":"<p>In der Welt der Programmierung gibt es heutzutage viele Technologien und eine gro\u00dfe Anzahl von Frameworks, um jede Art von Anwendung f\u00fcr nahezu jeden Bedarf zu erstellen. Aber diese Technologien sind dabei oft in &#8222;Schichten&#8220; unterteilt, die sich nur selten \u00fcberschneiden. In der Webwelt gibt es beispielsweise zahlreiche Javascript-Frameworks, mit denen sich eine lebendige Benutzeroberfl\u00e4che mit verschiedenen Stilen, Animationen usw. erstellen lassen. Auf der anderen Seite muss z. B. eine Bankensoftware robust und zuverl\u00e4ssig sein und eine gro\u00dfe Anzahl von Transaktionen pro Sekunde verarbeiten k\u00f6nnen. Eine andere Welt sind soziale Netzwerke, die auch bei langsamen Internet und\u00a0 Ger\u00e4ten viele Inhalte in einer mobilen Umgebung bereitstellen m\u00fcssen. Doch was w\u00e4re, wenn wir versuchen w\u00fcrden, die St\u00e4rken der einzelnen Technologien zu nutzen und sie zu kombinieren?<\/p>\r\n<p>Hallo, ich bin <a href=\"https:\/\/www.centigrade.de\/de\/unternehmen\/team#mikhail.shabanov\">Mikhail<\/a> von Centigrade. Dies ist der erste Artikel der technischen Blog-Serie \u00fcber GraphQL Web-API, seine Implementierung in .Net 6.0 und wie es von React-Client verwendet werden sollte.<\/p>\r\n<p><!--more--><\/p>\r\n<h2>Unsere Anwendung<\/h2>\r\n<p>Ich m\u00f6chte kein neues Hello World oder Bookstore Beispiel erstellen, um Graphql, .net und React zu zeigen. Ich m\u00f6chte real existierende Benutzeranforderungen l\u00f6sen, die wir in unserem Team haben, um einen echten Anwendungsfall zu haben. Mit allen Vor- und Nachteilen.<\/p>\r\n<p>Das Home-Office von 2020 bis 2021 hat unseren Lebensstil und unsere Gewohnheiten ver\u00e4ndert. Vielleicht waren die IT-Leute die einzigen, die das nicht bemerkt haben. Aber manchmal m\u00fcssen auch wir noch ein paar Worte miteinander wechseln, ein paar News austauschen, neue Tools, Frameworks und coole Funktionen diskutieren. Seit langem nutzt unser Team einen speziellen Chat in MS Teams, um Informationen \u00fcber Wissenswertes, Artikel und andere n\u00fctzliche Informationen auszutauschen. Aber ein solcher Chat ist nicht der richtige Ort f\u00fcr eine &#8222;Wissensdatenbank&#8220;.<\/p>\r\n<p>Eine Recherche nach vorgefertigten L\u00f6sungen zeigte, dass fertige &#8222;Wissensdatenbanken&#8220; eine Vielzahl von Tools mit einem gemeinsamen Nachteil boten &#8211; alle diese Anwendungen wurden nicht von uns entwickelt. Lassen Sie uns diesen Nachteil beseitigen und unsere eigene Wissensdatenbank mit blackjack und Hotchocolate erstellen. Und sie &#8222;VedaVersum&#8220; nennen! Veda = Wissen | Versum = Universum.<\/p>\r\n<p>Unsere Anwendung wird haben:<\/p>\r\n<ul>\r\n<li>Authentifizierungsmechanismus jeden Nutzerlogin.<\/li>\r\n<li>Anzeige von Kartenlisten. Jede Karte soll einen Text und einige Metadaten mit Erstellungszeitpunkt, erstelltem Benutzer, zugewiesenem Benutzer (optional) und zugeh\u00f6riger Karte (optional) enthalten<\/li>\r\n<li>Panel mit Avatar und Namen und &#8222;Glockensymbol&#8220;, das anzeigt, ob Sie eine zugewiesene Karte haben<\/li>\r\n<li>\u00a0&#8222;Wer ist online&#8220;-Panel. Sie k\u00f6nnen sehen, wie andere Nutzer in Echtzeit kommen und gehen.<\/li>\r\n<\/ul>\r\n<h2>Warum .Net 6.0?<\/h2>\r\n<p>Da wir eine dezentrale Anwendung erstellen wollen, die die gleichzeitige Arbeit mehrerer Benutzer unterst\u00fctzen soll, ben\u00f6tigen wir einen &#8222;Backend-Dienst&#8220;. Wenn wir von Backend sprechen, meinen wir Stabilit\u00e4t, Zuverl\u00e4ssigkeit und Leistung. Es gibt nur wenige Plattformen, die solche Optionen bieten k\u00f6nnen. .Net von Microsoft ist einer der ausgereiften Player auf diesem Gebiet. Und trotz seiner Reife, ist es mit seiner leichtgewichtigen, plattform\u00fcbergreifenden Version 6.0 so aktuell wie nie zuvor. Microsoft hat viel getan, um die Einstiegsschwelle in die Technologie zu vereinfachen. Es wurden zahlreiche Tutorials erstellt und die Einrichtung von Werkzeugen und Entwicklungsumgebungen vereinfacht. Microsoft hat bis heute die besten IDEs f\u00fcr Entwickler gebaut. Sie k\u00f6nnen das klassische Visual Studio und Visual Studio Code oder sogar jede beliebige IDE und Befehlszeilenschnittstelle verwenden. Und die gerade ver\u00f6ffentlichte neue .net Version 6.0 hat offiziellen Langzeitsupport von Microsoft.\u00a0 Viele Entwickler fangen daher an, .Net in ihren neuen Projekten zu verwenden. Aber es bleibt immer noch das gute alte .Net mit seiner Leistung, der riesigen Codebasis und der gro\u00dfen Anzahl von Drittanbieter-Bibliotheken. Und es gibt immer noch-das-gleiche-C# mit jahrzehntelanger klassischer Programmierung, OOP-Implementierung, Patterns und all den Features, die &#8222;b\u00e4rtige Programmierer&#8220; lieben. Also, ich habe mich hinrei\u00dfen lassen. F\u00fcr unsere Anwendung brauchen wir einen klassischen Webserver. Das Asp.Net-Projekt passt hier zu unseren Anforderungen.<\/p>\r\n<h2>Warum GraphQL?<\/h2>\r\n<p><a href=\"https:\/\/graphql.org\/\">GrapQL<\/a> ist eine Opensource Abfragesprache f\u00fcr die Web API von Facebook. Sie gew\u00e4hrleistet mehr Flexibilit\u00e4t und Effizienz f\u00fcr die App-Entwickler als die traditionelle REST-API. Sie k\u00f6nnen Abfragen erstellen und alle Daten oder bestimmte Teilmengen von Daten, die Sie ben\u00f6tigen, mit einer Anfrage abrufen. Der GraphQL-Server liefert Ihnen genau die Daten, die Sie angefordert haben. Dadurch wird das Problem des \u00dcberabrufs beseitigt. Subscriptions geh\u00f6ren zu den weiteren GraphQL Killing Features. Die App-Entwickler sind durch den Vorteil einer ganzen Abfragesprache viel flexibler, ohne dass sie auf API-Anpassungen oder -\u00c4nderungen warten m\u00fcssen.\u00a0 Wir werden sie in unserer L\u00f6sung verwenden, um alle Nutzer \u00fcber Karten\u00e4nderungen, Neuzug\u00e4nge und wenn jemand Ihnen eine Karte zugewiesen hat zu informieren. Auch mit GraphQL haben wir eine Menge anderer angenehmer Out-of-the-Box-Funktionen. Wie z.B. Typ\u00fcberpr\u00fcfung, Spielplatz-IDE und eine automatisch generierte API-Dokumentation.<\/p>\r\n<h2>Warum React?<\/h2>\r\n<p>Single Page Applications auf Basis von JavaScript-Frameworks sind fest in unser Leben getreten und haben altmodische UI-Konzepte hinter sich gelassen. Auch hier gibt es ein paar Giganten, die unter den Front-End-Entwicklern sehr beliebt sind. Angular von Google und React von Facebook. Dies sind hervorragende UI-Technologien f\u00fcr die Erstellung interaktiver Anwendungen f\u00fcr das Web, mobile und andere Plattformen. Heutzutage steigt die Bekanntheit von React von Tag zu Tag an. Es wird von Facebook unterst\u00fctzt und hat eine wachsende Community. Beim Vergleich von React und Angular habe ich festgestellt, dass React leichtgewichtiger, einfacher und deklarativer ist, weil es eine UI-Bibliothek und kein UI-Framework wie Angular ist. Und im Falle unserer einfachen Anwendung k\u00f6nnen wir mit React eine leistungsstarke UI mit weniger Aufwand erstellen.<\/p>\r\n<p>&nbsp;<\/p>\r\n<h2>Der Aufbau der Anwendung<\/h2>\r\n<p>Hier sieht man die grundlegende Architektur der Anwendung:<\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-14550\" src=\"https:\/\/www.centigrade.de\/wordpress\/wp-content\/uploads\/Bild1.png\" alt=\"Application Design\" width=\"624\" height=\"209\" srcset=\"https:\/\/www.centigrade.de\/wordpress\/wp-content\/uploads\/Bild1.png 624w, https:\/\/www.centigrade.de\/wordpress\/wp-content\/uploads\/Bild1-300x100.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/p>\r\n<p>Unsere Anwendung wird ein Backend mit GraphQL API haben, das Entit\u00e4ten in einer Datenbank speichert. Und <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single-page_application\">Single Page Application (SPA)<\/a> Client, der mit der API kommunizieren wird. In diesem Artikel werden wir uns auf das Backend konzentrieren. Unser Backend wird zwei Entit\u00e4ten haben &#8211; <em>Benutzer<\/em> und <em>VedaVersumCard<\/em>. GraphQL wird einige Abfragen haben, um Benutzer- und Kartenlisten zu erhalten. Und Mutation zum Erstellen oder Aktualisieren der Karte. Und zwei Subscriptions &#8211; <em>UserAction<\/em> (wer kam oder ging), und <em>CardChanged<\/em>. Alle Details k\u00f6nnen Sie unten sehen.<\/p>\r\n<h2>Los gehts!<\/h2>\r\n<p>Nachfolgend ist eine Beschreibung von allen Schritten, um ein Projekt von Grund auf selbst zu erstellen. Den fertigen Quellcode f\u00fcr diese L\u00f6sung gibt es <a href=\"https:\/\/github.com\/Centigrade\/vedaversum\">auf GitHub unter diesem Link<\/a><\/p>\r\n<p>Im Artikel werden wir ein Backend mit GraphQL API von Grund auf erstellen, los gehts!<\/p>\r\n<p>Zuallererst sollten Sie <a href=\"https:\/\/dotnet.microsoft.com\/download\/dotnet\/6.0\">.Net 6.0 SDK<\/a> installiert haben. Sie k\u00f6nnen <a href=\"https:\/\/visualstudio.microsoft.com\/downloads\/\">Visual Studio 22<\/a> oder <a href=\"https:\/\/code.visualstudio.com\/\">VS Code<\/a> (oder jede andere IDE, die Sie m\u00f6gen) mit <a href=\"Dotnet%20CLI\">Dotnet CLI<\/a> verwenden.<\/p>\r\n<p>Wir erstellen das Projekt &#8222;ASP.NET Core Empty&#8220; mit dem Framework &#8222;ASP.NET Core 6.0&#8220; und nennen es <em>VedaVersum<\/em><\/p>\r\n<p>In Visual Studio k\u00f6nnen wir ein paar einfachen Schritten folgen &#8211; starten Sie &#8222;Neues Projekt&#8220;, w\u00e4hlen Sie &#8222;ASP.Net Core Web Application&#8220;, dann &#8222;ASP.NET Core Empty&#8220;, w\u00e4hlen Sie das Zielnetzwerk und geben Sie dem Projekt einen Namen.\u00a0<\/p>\r\n<p>Wenn Sie VS Code verwenden, \u00f6ffnen Sie die Befehlszeile und f\u00fchren Sie diese Befehle aus:<\/p>\r\n<pre>md VedaVersum\r\ncd VedaVersum\r\ndotnet new web\r\ncode .<\/pre>\r\n<p>Damit wird eine einfache ASP.NET-Anwendung mit 2 Klassen erstellt &#8211; <em>Program<\/em> With <em>Main<\/em> -Methode, die den Webhost erstellt und ausf\u00fchrt. Und Startup, die 2 Methoden hat. Eine f\u00fcr die Einrichtung aller ben\u00f6tigten Dienste im <em>Dependency Injection<\/em> <em>Container<\/em> und die Zweite ist f\u00fcr die Einrichtung der HTTP Request Pipeline. So sieht die anf\u00e4ngliche Configure-Methode aus:<\/p>\r\n<p>&nbsp;<\/p>\r\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/ This method gets called by the runtime. Use this method to configure the HTTP request pipeline.\r\npublic void Configure(IApplicationBuilder app, IWebHostEnvironment env)\r\n{\r\n    app.UseRouting();\r\n\r\n    app.UseEndpoints(endpoints =&gt;\r\n    {\r\n        endpoints.MapGet(&quot;\/&quot;, async context =&gt;\r\n        {\r\n            await context.Response.WriteAsync(&quot;Hello World!&quot;);\r\n        });\r\n    });\r\n}\r\n\r\n<\/pre><\/div>\r\n<p>ASP.Net ist so aufgebaut, dass jede HTTP-Anfrage eine pipeline von Handlern namens <em>Middleware.Configure<\/em> durchl\u00e4uft. Die Configure-Methode beschreibt, welche middleware an der pipeline beteiligt sein wird. Im Moment gibt es nur eine Routing-Middleware und einen einfachen Endpunkt-Handler, der die Anfrage an die Root-Adresse abf\u00e4ngt und als HTTP-Antwort den Klartext &#8222;Hello World&#8220; zur\u00fcckgibt. Wir k\u00f6nnen die soeben erstellte Anwendung ausf\u00fchren (in VS Code mit dem Befehl dotnet run) und uns das &#8222;Hello World&#8220; im Browser ansehen ?.<\/p>\r\n<p>So weit, so gut. Das Ger\u00fcst unserer API ist fertig, es ist an der Zeit, ihr etwas vern\u00fcnftiges hinzuzuf\u00fcgen. Beginnen wir mit unserem Datenmodell. Wir erstellen den Ordner Model in unserer L\u00f6sung und f\u00fcgen die Entit\u00e4ten <em>User, VedaVersumCard, enum VedaVersumCardAction und CardActionMessage <\/em>hinzu<em>.<\/em><\/p>\r\n<p>&nbsp;<\/p>\r\n<h2>Eine GraphQL API erstellen<\/h2>\r\n<p>Nachdem wir die wichtigsten Entit\u00e4ten erstellt haben, ist es an der Zeit, unseren Benutzern die M\u00f6glichkeit zu geben, sie zu bedienen. Unser Backend sollte in der Lage sein, Standard-CRUD-Operationen durchzuf\u00fchren. Dazu geh\u00f6ren das Erstellen neuer Wissensdatenbankkarten, das Lesen vorhandener Karten, das Bearbeiten von Karten, das L\u00f6schen von Karten und die Benachrichtigung von Benutzern, wenn ihnen Karten zugewiesen wurden. In Bezug auf GraphQL sollten wir ein Schema und die Methoden definieren, die Daten \u00e4ndern (Mutations), Methoden, die Daten abfragen (Queries) und Push-Benachrichtigungen vom Server zum Client (Subscriptions). Um das Schema mit Queries, Mutations und Subscriptions mit allen bekannten Plattformen wie .Net zu implementieren, sollten wir Methoden implementieren, die Resolver genannt werden. Und es sollten auch Mapper von nativen Dotnet-Objekten in GraphQL <em>object<\/em> und <em>input<\/em> Typen vorhanden sein.<\/p>\r\n<p>Es gibt mehrere Drittanbieter-Bibliotheken f\u00fcr die Erstellung von GraphQL API mit .Net. <a href=\"https:\/\/graphql.org\/code\/#c-net\">Hier eine Liste<\/a>.<\/p>\r\n<p><a href=\"https:\/\/github.com\/graphql-dotnet\/graphql-dotnet\">Graphql-dotnet<\/a> setzt voraus, dass Sie alle ObjectTypes manuell beschreiben. Das bedeutet, dass Sie f\u00fcr jede Dotnet-Business-Entit\u00e4t einen entsprechenden ObjectType haben sollten. Da wir nur zwei Entit\u00e4ten haben, ist das kein gro\u00dfes Problem. Aber wenn wir ein umfangreiches Datenmodell haben, macht dieser Ansatz die L\u00f6sung ein wenig un\u00fcbersichtlich und kompliziert.<\/p>\r\n<p>In <a href=\"https:\/\/github.com\/ChilliCream\/hotchocolate\">Hotchocolate<\/a> werden Objekttypen &#8222;darunter&#8220; erstellt, und Sie k\u00f6nnen dotnet-Gesch\u00e4ftsentit\u00e4ten direkt in den Resolvern und Mutationen ohne zus\u00e4tzliche Klassen und Konvertierungen verwenden. Und auch wir werden diese Bibliothek f\u00fcr unsere L\u00f6sung nehmen, weil ja jeder Schokolade liebt.<\/p>\r\n<div class=\"tenor-gif-embed\" data-postid=\"14768025\" data-share-method=\"host\" data-aspect-ratio=\"1.33333\" data-width=\"60%\"><a href=\"https:\/\/tenor.com\/view\/chocolate-ill-take-130s-kid-gif-14768025\">Chocolate Ill Take GIF<\/a>from <a href=\"https:\/\/tenor.com\/search\/chocolate-gifs\">Chocolate GIFs<\/a><\/div>\r\n<p><script type=\"text\/javascript\" async=\"\" src=\"https:\/\/tenor.com\/embed.js\"><\/script><\/p>\r\n<p>Um es in unserem Projekt zu verwenden, m\u00fcssen wir zun\u00e4chst die Hotchocolate-Assembly als Nuget-Paket referenzieren. Sie k\u00f6nnen den Nuget-Paketmanager in Visual Studio verwenden, um das Paket <em>HotChocolate.AspNetCore<\/em> hinzuzuf\u00fcgen. In VS Code sollten Sie folgenden Befehl ausf\u00fchren:<\/p>\r\n<pre>dotnet add package HotChocolate.AspNetCore<\/pre>\r\n<p>Unser GraphQL-API-Dienst wird Queries, Mutations und Subscriptions haben. Um diese zu implementieren, sollten wir drei separate Klassen erstellen &#8211; VedaVersumQuery, VedaVersumSubscription und VedaVersumMutation. Im Moment gibt es noch keine Implementierung und ich werde hier nicht den ganzen Code schreiben, sp\u00e4ter werde ich den Link zur endg\u00fcltigen L\u00f6sung zur Verf\u00fcgung stellen, damit Sie sie herunterladen und testen k\u00f6nnen.<\/p>\r\n<p>Die Abfragen sind also nur einfache c#-Methoden. Zum Beispiel:<\/p>\r\n<p>&nbsp;<\/p>\r\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/\/ &lt;summary&gt;\r\n\/\/\/ Returns all cards in the base\r\n\/\/\/ &lt;\/summary&gt;\r\npublic Task&lt;IEnumerable&lt;VedaVersumCard&gt;&gt; GetAllCards()\r\n{\r\n    \/\/ Return mock object so far\r\n    return Task.FromResult&lt;IEnumerable&lt;VedaVersumCard&gt;&gt;(new&#x5B;] {new VedaVersumCard\r\n    {\r\n        Id = Guid.NewGuid().ToString(),\r\n        Title = &quot;Very First Card.&quot;,\r\n        Created = DateTimeOffset.Now,\r\n        Content =\r\n            &quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.&quot;,\r\n        UserCreated = Guid.NewGuid().ToString()\r\n    }});\r\n}\r\n\r\n<\/pre><\/div>\r\n<p>F\u00fcr subscriptions werden wir den <em>InMemorySubscription<\/em> Mechanismus und <em>ITopicEventSender<\/em> von HotChocolate verwenden. Um unsere Methode mit diesem Mechanismus zu verbinden, f\u00fcgen wir zwei Attribute hinzu &#8211; Subscribe und Topic. Und das ist alles. So sieht Subscription aus:<\/p>\r\n<p>&nbsp;<\/p>\r\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/\/ &lt;summary&gt;\r\n\/\/\/ Subscription event fires when new user arrives online\r\n\/\/\/ &lt;\/summary&gt;\r\n\/\/\/ &lt;returns&gt;&lt;\/returns&gt;\r\n&#x5B;Subscribe]\r\n&#x5B;Topic]\r\npublic User UserArrived(&#x5B;EventMessage] User user)\r\n{\r\n    return user;\r\n}\r\n\r\n<\/pre><\/div>\r\n<p>In unserer mutation class werden wir ITopicEventSender einf\u00fcgen und ihn zum Ausl\u00f6sen des subscription event verwenden:<\/p>\r\n<p>&nbsp;<\/p>\r\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/\/ &lt;summary&gt;\r\n\/\/\/ Notification about user enter\r\n\/\/\/ &lt;\/summary&gt;\r\npublic async Task&lt;User&gt; UserEnters(string userId)\r\n{\r\n    \/\/ ToDo: Mock implementation.\r\n    var user = new User\r\n    {\r\n        Id = userId,\r\n        Name = &quot;Anakin Skywalker&quot;,\r\n        UserImage = &quot;https:\/\/static.wikia.nocookie.net\/starwars\/images\/6\/6f\/Anakin_Skywalker_RotS.png&quot;\r\n    };\r\n\r\n    await _iTopicEventSender.SendAsync(\r\n        nameof(VedaVErsumSubscription.UserArrived),\r\n        user);\r\n    return user;\r\n}\r\n\r\n<\/pre><\/div>\r\n<p>Und nun das Wichtigste &#8211; die Einrichtung von Diensten und Pipeline-Middleware. \u00c4ndern wir die Klasse <em>Startup<\/em> wie folgt:<\/p>\r\n<p>&nbsp;<\/p>\r\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\npublic class Startup\r\n{\r\n    \/\/ This method gets called by the runtime. Use this method to add services to the container.\r\n    \/\/ For more information on how to configure your application, visit https:\/\/go.microsoft.com\/fwlink\/?LinkID=398940\r\n    public void ConfigureServices(IServiceCollection services)\r\n    {\r\n        services\r\n            .AddGraphQLServer()\r\n            .AddInMemorySubscriptions()\r\n            .AddQueryType&lt;VedaVersumBaseQuery&gt;()\r\n            .AddMutationType&lt;VedaVersumMutation&gt;()\r\n            .AddSubscriptionType&lt;VedaVersumSubscription&gt;();\r\n    }\r\n\r\n    \/\/ This method gets called by the runtime. Use this method to configure the HTTP request pipeline.\r\n    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\r\n    {\r\n        app\r\n            .UseWebSockets()\r\n            .UseRouting()\r\n            .UseEndpoints(endpoints =&gt;\r\n            {\r\n                endpoints.MapGraphQL();\r\n            });\r\n    }\r\n}\r\n\r\n<\/pre><\/div>\r\n<p>Wie wir sehen k\u00f6nnen, erledigt HotChocolate die ganze &#8222;Drecksarbeit&#8220; f\u00fcr uns ? Die <em>ConfigureServices<\/em>-Methode richtet alle ben\u00f6tigten Dienste ein und bindet unsere Query-, Mutation- und Subscription-Klassen ein. Die Configure-Methode richtet die WebSockets-Middleware ein, die f\u00fcr Subscriptions erforderlich ist, und bildet dann den GraphQL-Endpunkt ab.<\/p>\r\n<p>Wenn Sie schon einmal GraphQL verwendet haben, wissen Sie bereits, dass jeder GraphQL-Endpunkt einige Metadaten bereitstellt, die die API beschreiben. Und es gibt ein paar leistungsstarke Tools wie <a href=\"https:\/\/github.com\/graphql\/graphiql\">Graphiql<\/a> und <a href=\"https:\/\/github.com\/graphql\/graphql-playground\">Playground<\/a>. Diese Werkzeuge bieten eine Art GraphQL IDE. Sie haben eine ganze Dokumentation als Service \u00fcber alle queries, mutations, subscriptions und Datentypen, die der Endpunkt out of the box bereitstellt. Und diese Informationen werden auch als Intellisense-Tooltips verwendet, wenn Sie GraphQL-Abfragen in der integrierten Spielwiese dort schreiben. Vielleicht ist Ihnen in den obigen Codebeispielen aufgefallen, dass ich XML-Kommentare mit query-, mutation- und subscription-methoden verwende. Diese Kommentare kann HotChocolate als GraphQL-Methodenbeschreibung erstellen und zu den Endpunkt-Metadaten hinzuf\u00fcgen. Um dies zu erreichen, sollten Sie Ihre VedaVersum.csproj-Datei wie folgt bearbeiten:<\/p>\r\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n&lt;PropertyGroup&gt;\r\n    ...\r\n    &lt;GenerateDocumentationFile&gt;true&lt;\/GenerateDocumentationFile&gt;\r\n    &lt;NoWarn&gt;$(NoWarn);1591&lt;\/NoWarn&gt;\r\n&lt;\/PropertyGroup&gt;\r\n\r\n<\/pre><\/div>\r\n<p>Dadurch wird jedes Mal, wenn Sie Ihr Projekt kompilieren, eine Dokumentationsdatei aus diesen XML-Kommentaren erstellt.<\/p>\r\n<h2>Banana Cake Pop IDE<\/h2>\r\n<p>In fr\u00fcheren Versionen der Hotchocolate-Bibliothek gab es eine eingebaute Playground-IDE. Ab der Version 11 haben die Entwickler ihre eigene IDE <a href=\"https:\/\/chillicream.com\/docs\/bananacakepop\">Banana Cake Pop<\/a> entwickelt. Wenn Sie nun unsere Anwendung starten und zu localhost:5000\/graphql gehen, sollten Sie die Banana Cake Pop IDE sehen. Wenn Sie auf der linken Seite auf eine Buch-Schaltfl\u00e4che klicken, sehen Sie die gesamte API-Beschreibung.<\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-14552\" src=\"https:\/\/www.centigrade.de\/wordpress\/wp-content\/uploads\/Bild2.png\" alt=\"Api Description\" width=\"557\" height=\"353\" srcset=\"https:\/\/www.centigrade.de\/wordpress\/wp-content\/uploads\/Bild2.png 557w, https:\/\/www.centigrade.de\/wordpress\/wp-content\/uploads\/Bild2-300x190.png 300w\" sizes=\"auto, (max-width: 557px) 100vw, 557px\" \/><\/p>\r\n<p>Sie k\u00f6nnen versuchen, Daten abzufragen:<\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-14554\" src=\"https:\/\/www.centigrade.de\/wordpress\/wp-content\/uploads\/Bild3.png\" alt=\"query data\" width=\"557\" height=\"318\" srcset=\"https:\/\/www.centigrade.de\/wordpress\/wp-content\/uploads\/Bild3.png 1120w, https:\/\/www.centigrade.de\/wordpress\/wp-content\/uploads\/Bild3-300x171.png 300w, https:\/\/www.centigrade.de\/wordpress\/wp-content\/uploads\/Bild3-768x438.png 768w\" sizes=\"auto, (max-width: 557px) 100vw, 557px\" \/><\/p>\r\n<p>Um die supscription zu starten, sollten Sie zwei Fenster \u00f6ffnen, in eines davon diese query schreiben und auf den &#8222;Play&#8220; button klicken:<\/p>\r\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nsubscription {\r\n  userArrived {\r\n    id\r\n    name\r\n    userImage\r\n  }\r\n}\r\n\r\n<\/pre><\/div>\r\n\r\n\r\n<p>Schreiben Sie die mutation in das zweite Fenster und klicken Sie auf den &#8222;Play&#8220; button klicken:<\/p>\r\n\r\n\r\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nmutation {\r\n  userEnters(userId: &quot;123-abc&quot;) {\r\n    id\r\n  }\r\n}\r\n<\/pre><\/div>\r\n\r\n\r\n<p>Im ersten Fenster sehen Sie, dass eine subscription-Meldung erschienen ist:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1120\" height=\"496\" class=\"wp-image-14556\" src=\"https:\/\/www.centigrade.de\/wordpress\/wp-content\/uploads\/Bild4.png\" alt=\"subscription\" srcset=\"https:\/\/www.centigrade.de\/wordpress\/wp-content\/uploads\/Bild4.png 1120w, https:\/\/www.centigrade.de\/wordpress\/wp-content\/uploads\/Bild4-300x133.png 300w, https:\/\/www.centigrade.de\/wordpress\/wp-content\/uploads\/Bild4-768x340.png 768w\" sizes=\"auto, (max-width: 1120px) 100vw, 1120px\" \/><\/figure>\r\n<h2>Fazit<\/h2>\r\n<p>Wir haben einen Blick darauf geworfen, wie einfach es sein kann, eine GraphQL API mit .Net 6.0 und der Hotchocolate Bibliothek zu erstellen und diese API ohne Single Page Application oder javascript clientseitigen Code abzufragen. Im n\u00e4chsten Artikel werden wir Autorisierung zu unserer Anwendung hinzuf\u00fcgen, werden alle Daten in der Datenbank speichern, werden alle Vorteile von GraphQL Data Loaders sehen und alle Backend Logik beenden. Der letzte Teil wird sich dann auf das Frontend mit React konzentrieren. Bleibt dran&#8230;<\/p>\r\n","protected":false},"author":66,"featured_media":0,"template":"","tags":[887,888,383,890,514,112,617],"class_list":["post-14569","blog","type-blog","status-publish","hentry","tag-net-de","tag-api-de","tag-c-de","tag-graphql-de","tag-react","tag-software-entwickler","tag-ux-engineering"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.centigrade.de\/de\/wp-json\/wp\/v2\/blog\/14569","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.centigrade.de\/de\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.centigrade.de\/de\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.centigrade.de\/de\/wp-json\/wp\/v2\/users\/66"}],"version-history":[{"count":5,"href":"https:\/\/www.centigrade.de\/de\/wp-json\/wp\/v2\/blog\/14569\/revisions"}],"predecessor-version":[{"id":14903,"href":"https:\/\/www.centigrade.de\/de\/wp-json\/wp\/v2\/blog\/14569\/revisions\/14903"}],"wp:attachment":[{"href":"https:\/\/www.centigrade.de\/de\/wp-json\/wp\/v2\/media?parent=14569"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.centigrade.de\/de\/wp-json\/wp\/v2\/tags?post=14569"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}