{"id":21121,"date":"2020-06-25T12:35:36","date_gmt":"2020-06-25T10:35:36","guid":{"rendered":"https:\/\/www.inovex.de\/blog\/?p=18817"},"modified":"2022-09-27T08:18:15","modified_gmt":"2022-09-27T06:18:15","slug":"backend-tech-stacks-net-core","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/","title":{"rendered":"Backend Tech Stacks: .NET Core"},"content":{"rendered":"<p>In dieser Artikelserie m\u00f6chten wir euch einen Einblick geben, wie typische Projekte aus technologischer Sicht bei uns aussehen. Wir betrachten dazu in einzelnen kurzen Artikeln unterschiedliche Tech-Stacks. Wir ber\u00fccksichtigen dabei auf keinen Fall all unsere Projekte, m\u00f6chten aber zeigen, wie viele oder gar die meisten j\u00fcngeren Projekte in diesem Bereich aufgebaut sind. Es geht uns hier also weniger um die Bandbreite aller Projekte, sondern eher h\u00e4ufig auftretende Gemeinsamkeiten. Auch interessieren uns hier mehr die j\u00fcngeren Projekte als die \u00e4lteren. In diesem Artikel soll es dabei um den .NET Tech-Stack gehen. Und da wir von j\u00fcngeren Projekten sprechen, geht es nat\u00fcrlich haupts\u00e4chlich um .NET Core ?.<!--more--><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#NET-Core\" >.NET Core<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#Basistechnologie\" >Basistechnologie<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#Third-Party-Erweiterungen\" >Third-Party-Erweiterungen<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#ORM\" >ORM<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#Logging\" >Logging<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#HTTP-Client\" >HTTP-Client<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#Object-Mapping\" >Object-Mapping<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#JSON-Parsing\" >JSON Parsing<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#Testing\" >Testing<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#API-Dokumentation\" >API Dokumentation<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#Tooling\" >Tooling<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#Hosting-und-Operations\" >Hosting und Operations<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#Public-Cloud\" >Public Cloud<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#Development\" >Development<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#App-Hosting\" >App Hosting<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#Database\" >Database<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#Secret-Management\" >Secret Management<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#Security\" >Security<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#Logging-und-Monitoring\" >Logging und Monitoring<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#Zusammenfassung\" >Zusammenfassung<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"NET-Core\"><\/span>.NET Core<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Seit .NET Core und besonders ab Version\u00a03.0 erfreuen sich .NET Projekte erh\u00f6hter Nachfrage durch Kunden:innen und gr\u00f6\u00dferer Beliebtheit unter unseren Entwickler:innen. Einer der Gr\u00fcnde hierf\u00fcr ist definitiv die Cross-Plattform Verf\u00fcgbarkeit. Wir betreuen durchaus klassische .NET Projekte, die wir in der Vergangenheit aufgebaut haben. Da es sich dabei in der Regel um gr\u00f6\u00dfere Anwendungen handelt, werden diese auch in dieser Form weiter gepflegt. Neue Projekte werden allerdings nur noch in .NET Core umgesetzt.<\/p>\n<p>.NET Core wird inzwischen als Open-Source-Projekt auf Github gepflegt und auch weitgehend mit der entsprechenden Philosophie von seinen Entwicklern behandelt. Das gilt erfreulicherweise auch f\u00fcr die ausf\u00fchrliche Dokumentation, die direkt verlinkt eventuelle Github Issues beinhaltet, die auf m\u00f6gliche Errata hinweisen k\u00f6nnen.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Basistechnologie\"><\/span>Basistechnologie<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Das Release der .NET Core Version 3.0 im September 2019 brachte einige erhebliche Neuerungen mit sich. Hierzu z\u00e4hlt unter anderem der Support f\u00fcr .NET Standard 2.1 mit den speichereffizienten Span&lt;T&gt; Typen, Trimming von ungenutzten Codeteilen f\u00fcr self-contained Apps und ReadyToRun Images. Wem das alles nichts sagt, kann sich auch die <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/core\/whats-new\/dotnet-core-3-0\">vollst\u00e4ndigen Versionshinweise<\/a> durchlesen.<\/p>\n<p>Einige Projekte konnten wir bereits mit dem Release Candidate der Version 3.0 starten, weil wir wussten, dass die Laufzeit des Projekts definitiv \u00fcber den Release der 3.0 hinausgehen w\u00fcrde. Seitdem starten wir neue Projekte mit der aktuellen Version 3.1 (aktuell 3.1.3). Die Version 3.1 ist eine LTS Version und bekommt damit f\u00fcr mindestens drei Jahre Support. Der neue Release-Plan von Microsoft sieht vor jedes Jahr im November eine neue Hauptversion zu ver\u00f6ffentlichen.<\/p>\n<p>Wenn wir von .NET-Core-Anwendungen sprechen, handelt es sich in unserem Umfeld vor allem um ASP.NET Core Anwendungen, die als API-Backend eingesetzt werden.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Third-Party-Erweiterungen\"><\/span>Third-Party-Erweiterungen<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Wie in vielen anderen Sprachen und Frameworks setzen wir auch in .NET diverse Erweiterungen ein:<\/p>\n<h3><span class=\"ez-toc-section\" id=\"ORM\"><\/span>ORM<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Ein Projekt ohne ORM w\u00e4re im .NET-Umfeld bei uns eine Rarit\u00e4t. Wir sch\u00e4tzen den Komfort und mitunter die Sicherheit, den diese Tools uns Entwicklern liefern.<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/dotnet\/efcore\"><strong>EntityFramework (EF) Core<\/strong><\/a> wird in Projekten am h\u00e4ufigsten eingesetzt. Hier fehlen noch einige Funktionen, die das<strong> EntityFramework<\/strong> (ohne Core) unterst\u00fctzt, es reift aber mit jedem neuen Release. Eine der wohl beliebtesten Funktionen ist hierbei das Erzeugen von Datenbank-Migrationen aus Code-\u00c4nderungen in Model-Klassen.<\/li>\n<li><a href=\"https:\/\/github.com\/StackExchange\/Dapper\"><strong>Dapper<\/strong><\/a> ist ein sehr minimalistischer Ansatz im Vergleich zu EF Core und hat ein deutlich kleineres Feature-Set. Das Framework ist bei uns nur selten in Verwendung. Unter anderem, weil die Abstraktion der SQL-Queries in anderen Tools gerne gesehen wird.<\/li>\n<\/ul>\n<p>Zus\u00e4tzlich kommt je nach eingesetzter Datenbank eventuell ein zus\u00e4tzlicher Provider zum Einsatz. <strong>EF Core<\/strong> unterst\u00fctzt beispielsweise nativ nur die Anbindung an <a href=\"https:\/\/www.microsoft.com\/de-de\/sql-server\"><strong>MSSQL<\/strong><\/a> Datenbanken. Da wir h\u00e4ufig auch andere Datenbanken wie <a href=\"https:\/\/www.postgresql.org\/\"><strong>PostgreSQL<\/strong><\/a> einsetzen, kommt beispielsweise <a href=\"https:\/\/www.npgsql.org\/\"><strong>npgsql<\/strong><\/a> ebenso oft zum Einsatz.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Logging\"><\/span>Logging<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Das standardm\u00e4\u00dfig gelieferte Logging-System von .NET Core ist ausreichend f\u00fcr simple Einsatzzwecke. Gerade, wenn einfach in ein lokales Dateisystem geloggt werden soll, erf\u00fcllt es seinen Zweck. Trotzdem kommen mitunter auch hier Erweiterungen zum Einsatz:<\/p>\n<ul>\n<li><a href=\"https:\/\/nlog-project.org\/\"><strong>NLog<\/strong><\/a> erm\u00f6glicht das Logging in unterschiedlichen Formaten an diverse Ziele. Es kann beispielsweise in Format A auf eine virtuelle Konsole und in Format B direkt an einen Elastic Server geloggt werden.<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"HTTP-Client\"><\/span>HTTP-Client<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Wenn unser .NET Backend mal selbst HTTP Requests ausf\u00fchren muss \u2026<\/p>\n<ul>\n<li>bringt<a href=\"https:\/\/github.com\/App-vNext\/Polly\"><strong> Polly<\/strong><\/a>\u00a0einfache M\u00f6glichkeiten mit, die .NET-nativen <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.net.http.httpclient?view=netcore-3.1\">HTTPClients<\/a> um Funktionen wie Retry-Mechanismen und Circuit Breaker zu erweitern<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Object-Mapping\"><\/span>Object-Mapping<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li><a href=\"https:\/\/automapper.org\/\"><strong>Automapper<\/strong><\/a> wird vor allem verwendet, um Entity auf DTO-Objekte zu mappen und umgekehrt. Sind Felder identisch in Typ und Name, passiert dies mit sehr wenig Aufwand. Viele andere Sonderf\u00e4lle k\u00f6nnen konfiguriert werden und Automapper l\u00e4sst sich auch f\u00fcr andere, wahrscheinlich nicht intendierte Zwecke verwenden, wie etwa zwei Teil-Objekte zu einem neuen\u00a0<em>vollst\u00e4ndigen<\/em>\u00a0zu kombinieren.<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"JSON-Parsing\"><\/span>JSON Parsing<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Da wir vor allem Web-APIs bauen, reden wir in der Regel von HTTP-basiertem Traffic und damit fast immer von JSON-Payloads, die verarbeitet werden m\u00fcssen.<\/p>\n<ul>\n<li><a href=\"https:\/\/www.newtonsoft.com\/json\"><strong>Newtonsoft Json.NET<\/strong><\/a> war lange Zeit der Platzhirsch und ist immer noch ein m\u00e4chtiger Parser mit vielen Konfigurationsm\u00f6glichkeiten.<\/li>\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.text.json?view=netcore-3.1\"><strong>System.Text.Json<\/strong><\/a> ist jetzt bei uns oft erste Wahl. Nicht zuletzt, weil es der neue standardm\u00e4\u00dfig integrierte Parser ist. Der ist aktuell noch nicht in jeder Hinsicht ausgereift, l\u00e4sst sich aber ebenfalls in vielen Aspekten erweitern.<\/li>\n<li><a href=\"https:\/\/github.com\/neuecc\/Utf8Json\"><strong>Utf8Json<\/strong><\/a> kann eingesetzt werden, wenn Performance die oberste Priorit\u00e4t ist.<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Testing\"><\/span>Testing<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>F\u00fcr die simpleren Tests verwenden wir gerne und h\u00e4ufig die folgenden Helfer:<\/p>\n<ul>\n<li><a href=\"https:\/\/xunit.net\/\"><b>xUnit<\/b><\/a><span style=\"font-weight: 400;\"> hat bei uns mit seinen Facts und Theories den Vorzug \u00fcber <\/span><a href=\"https:\/\/nunit.org\/\"><b>nUnit<\/b><\/a><span style=\"font-weight: 400;\"> gefunden. Die Theories erm\u00f6glichen es uns auf einfache Weise Testfunktionen mit variablen Inputs zu f\u00fcttern.<\/span><\/li>\n<li><a href=\"https:\/\/github.com\/shouldly\/shouldly\"><strong>Shouldly<\/strong><\/a> macht Assertions einfacher zu lesen und zu schreiben<\/li>\n<li><a href=\"https:\/\/fakeiteasy.github.io\/\"><strong>FakeItEasy<\/strong><\/a> hilft, sehr einfach Fake-Objekte zu erstellen, die als Mock-Input f\u00fcr Funktionen und \u00e4hnliches verwendet werden k\u00f6nnen.<\/li>\n<\/ul>\n<p>Die genannten Libraries werden vor allem f\u00fcr Unit Tests verwendet. In Kombination mit der <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/microsoft.aspnetcore.mvc.testing.webapplicationfactory-1?view=aspnetcore-3.0\"><strong>WebApplicationFactory<\/strong><\/a> k\u00f6nnen sie auch dazu verwendet werden, Integrationstests innerhalb eines Service-Scopes auszuf\u00fchren. Die <a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/test\/integration-tests?view=aspnetcore-3.1\">offizielle Dokumentation von Microsoft<\/a> gibt hierzu auch einige Hinweise.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"API-Dokumentation\"><\/span>API Dokumentation<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Da geschriebene API-Endpunkte letztendlich ja auch von jemandem verwendet werden sollen, sollten sie m\u00f6glichst gut dokumentiert sein. Das erreichen wir meist mit <a href=\"https:\/\/github.com\/domaindrivendev\/Swashbuckle\"><strong>Swashbuckle<\/strong><\/a>. Die Library liefert uns einen Swagger-Endpunkt mit einer OpenAPI-konformen Dokumentation der API im JSON-Format. Das funktioniert besonders gut, wenn man hierzu noch die XML-Docs aktiviert und die Endpunkte entsprechend kommentiert. Auf Wunsch l\u00e4sst sich hierzu auch eine Swagger-UI aktivieren, die Endpunkte anzeigt. Mittels der genannten UI lassen sich auch Requests gegen die Endpunkte mit anpassbaren Daten fahren und bestimmte F\u00e4lle testen.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Tooling\"><\/span>Tooling<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Auch wenn Windows das intuitiv passende Betriebssystem f\u00fcr .NET-Entwicklung zu sein scheint, ist die Entwicklung unter macOS oder Linux inzwischen genauso gut m\u00f6glich. Man kann jetzt (dank der Core-Variante) frei nach pers\u00f6nlichen Vorlieben entscheiden und muss keine Kompromisse eingehen.<\/p>\n<p>Die IDE, die im .NET-Kosmos wohl schon am l\u00e4ngsten beheimatet ist und damit der Klassiker ist\u00a0<a href=\"https:\/\/visualstudio.microsoft.com\/\">Visual Studio<\/a>, das immer noch gerne verwendet wird. Durch <a href=\"https:\/\/visualstudio.microsoft.com\/vs\/mac\/\">Visual Studio for Mac<\/a> haben inzwischen auch Mac-Nutzer:innen die M\u00f6glichkeit, das Tool (mit leichten \u00c4nderungen) einzusetzen. Bei uns wird das Programm inzwischen immer seltener eingesetzt \u2013 vor allem durch die sehr guten Alternativen bedingt. Wo es im Einsatz ist, meist mit <a href=\"https:\/\/www.jetbrains.com\/resharper\/\">ReSharper<\/a> von Jetbrains.<\/p>\n<p>Auch wenn der Name <a href=\"https:\/\/code.visualstudio.com\/\">Visual Studio Code<\/a> an das zuvor genannte klassische Visual Studio erinnert, ist es eine eigenst\u00e4ndige Neuentwicklung und die beiden Tools sind nur bedingt miteinander verwandt. Die IDE ist auf allen drei genannten Plattformen verf\u00fcgbar und danke vieler verf\u00fcgbaren Extensions sehr m\u00e4chtig und vielseitig einsetzbar. Beispielhaft sind im genannten Kontext die Azure Extensions zu nennen.<\/p>\n<p>Im .NET-Umfeld ist bei uns sehr weit verbreitet Jetbrains <a href=\"https:\/\/www.jetbrains.com\/rider\/\"><span style=\"font-weight: 400;\">Rider<\/span><\/a> im Einsatz, egal welches Betriebssystem darunter l\u00e4uft. Visual Studio wird, wenn \u00fcberhaupt ausschlie\u00dflich mit <a href=\"https:\/\/www.jetbrains.com\/resharper\/\">Resharper<\/a> verwendet<\/p>\n<p>Von Jetbrains ist bei uns sehr h\u00e4ufig\u00a0<a href=\"https:\/\/www.jetbrains.com\/rider\/\">Rider<\/a> im Einsatz, egal welches Betriebssystem darunter l\u00e4uft. Vor allem, wenn man nicht nur .NET-Entwicklung betreibt, liefern die Jetbrains IDEs eine einheitliche Umgebung f\u00fcr unterschiedliche Sprachen und Frameworks.<\/p>\n<p>Neben den jeweiligen IDEs sind vor allem diverse CLIs in Verwendung. In der Regel vor allem die <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/core\/tools\/\">.NET CLI<\/a> und die dazu geh\u00f6rige\u00a0<a href=\"https:\/\/docs.microsoft.com\/en-us\/ef\/core\/miscellaneous\/cli\/dotnet\">EF-Core-Erweiterung<\/a>. Zus\u00e4tzlich je nach Hosting-Umgebung meist CLIs f\u00fcr Azure, Docker und\/oder Kubernetes.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Hosting-und-Operations\"><\/span>Hosting und Operations<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"Public-Cloud\"><\/span>Public Cloud<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Obwohl die meisten Public-Cloud-Anbieter das Hosting von .NET Anwendungen erm\u00f6glichen, gehen bei uns oft .NET und Azure Hand in Hand. Das empfohlene Modell zum Hosten von .NET Core ist Docker, wodurch eine Wechsel auf einen anderen Cloud-Anbieter vergleichsweise einfach bleibt. Selbstgehostete L\u00f6sungen wurden mit der Zeit immer seltener und sind nur noch selten anzutreffen.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Development\"><\/span>Development<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Wenn wir das Projekt ohnehin in Azure aufbauen, setzen wir zudem meist auf <strong>Azure DevOps<\/strong>, insbesondere wegen der sehr guten Integration der beiden Plattformen. Nicht alle Funktionen oder ihre Bedienbarkeit sind hundertprozentig ausgereift, vor allem an Stellen, an denen eine Konfiguration lange nur \u00fcber das Web-Portal und nicht durch Code konfigurierbar war. DevOps bietet aber inzwischen sehr gute Werkzeuge, um CI\/CD Pipelines (auch in Code-Form) aufzubauen.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"App-Hosting\"><\/span>App Hosting<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Eine der einfachsten Hosting-Methoden f\u00fcr (ASP).NET Core Services sind die <a href=\"https:\/\/azure.microsoft.com\/de-de\/services\/app-service\/\">App Services<\/a> von Azure. Diese k\u00f6nnen entweder mit Docker Images oder direkt mit den Build-Artefakten der Anwendungen bespielt werden und sind sehr gut integriert. SSl-Zertifikate bekommt man zum Hosting der Anwendung dazu und die Verwendung eigener Domains ist schmerzfrei. Die App Services k\u00f6nnen direkt aus den DevOps Pipelines heraus bef\u00fcllt werden; im Falle von Images kann entsprechend die Version erh\u00f6ht werden. Werden Docker Images verwendet, so k\u00f6nnen diese aus der Pipeline zun\u00e4chst in eine <a href=\"https:\/\/azure.microsoft.com\/de-de\/services\/container-registry\/\">Azure Container Registry<\/a> geladen werden, von wo sich der App Service selbst das Image in der gew\u00fcnschten Version laden kann.<\/p>\n<p>Alternativ zu den genannten h\u00e4ufigsten Vertretern kommen auch <a href=\"https:\/\/azure.microsoft.com\/de-de\/services\/functions\/\">Azure Functions <\/a>als Alternative zum Hosting auf Serverless-Basis zum Einsatz. Diese k\u00f6nnen entweder stateless oder durable eingesetzt werden. Au\u00dferdem setzen wir in gr\u00f6\u00dferen Projekten auf den <a href=\"https:\/\/azure.microsoft.com\/de-de\/services\/kubernetes-service\/\">Azure Kubernetes Service<\/a>. Hier kommen auch wieder Deployments mit Images zum Einsatz, die \u00fcber die Azure Container Registry als Zwischenstation laufen.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Database\"><\/span>Database<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><a href=\"https:\/\/azure.microsoft.com\/de-de\/services\/postgresql\/\">Azure Database for PostgreSQL<\/a> ist die managed Alternative zur selbstgehosteten Postgres-Datenbank. Postgres ist g\u00fcnstiger als vergleichbare MS-SQL-Varianten und kann f\u00fcr die Entwicklung einfach containerisiert auf den Entwicklungsrechnern hochgefahren werden. Im Umfeld der Public Cloud sind die managed Varianten der meisten Services wie Datenbanken fast immer die erste Wahl.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Secret-Management\"><\/span>Secret Management<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><a href=\"https:\/\/azure.microsoft.com\/de-de\/services\/key-vault\/\">Azure Key Vault<\/a> bietet die M\u00f6glichkeit, im Umfeld von Azure und Azure DevOps einfach und gut integriert Secrets und Zertifikate zu verwalten. Wir benutzen Key Vault gerne f\u00fcr diverse Teile unserer Infrastruktur: sowohl in Pipelines aus Dev Ops als auch in Services und Anwendungen. Durch das <a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/fundamentals\/configuration\/options?view=aspnetcore-3.1\">Options Pattern<\/a> in ASP.NET Core k\u00f6nnen beispielsweise Secrets automatisch aus dem KeyVault in den AppService gezogen und in der Anwendung geladen werden. Der Einrichtungsaufwand hierf\u00fcr ist minimal.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Security\"><\/span>Security<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Die Anforderungen in diesem Bereich sind offensichtlich besonders kritisch und sehr stark projektabh\u00e4ngig. Einige wenige erkennbare \u00dcberschneidungen gibt es aber.<\/p>\n<p>Einer der Gr\u00fcnde f\u00fcr die Nutzung von Azure liegt oft darin, dass unsere Kunden bereits im Universum von Microsoft unterwegs sind und potenziell einige Ressourcen bereits in Azure liegen. Das bringt oft ein bestehendes<a href=\"https:\/\/azure.microsoft.com\/de-de\/services\/active-directory\/\">\u00a0Azure AD<\/a> mit sich, das eingesetzt und angebunden werden kann oder soll.<\/p>\n<p>F\u00fcr kleinere Projekte eignet sich auch die in ASP.NET Core eingebaut <a href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/security\/authentication\/identity\">Identity-<\/a>Variante. Wenn es gr\u00f6\u00dfer wird, dann kommen Anwendungen, wie <a href=\"https:\/\/github.com\/IdentityServer\">Identity Server<\/a> oder <a href=\"https:\/\/www.keycloak.org\/\">Keycloak<\/a> zum Einsatz.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Logging-und-Monitoring\"><\/span>Logging und Monitoring<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Logging l\u00f6sen wir in unterschiedlichen Projekten sehr individuell. In kleineren Projekten kommt vor allem <a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/monitor\/#features\">Application Insights<\/a> als Teil des Azure-Monitor-Angebots zum Einsatz. Dieser bietet wohl die einfachste Integration in App Services und gleichzeitig out of the box sch\u00f6ne Features wie automatische WebServer Logs und Metriken \u00fcber Response Codes. Daneben setzen wir auch h\u00e4ufig L\u00f6sungen auf Basis des <a href=\"https:\/\/www.elastic.co\/products\/\">Elastic Stacks<\/a> und <a href=\"https:\/\/prometheus.io\/\">Prometheus<\/a> ein. Ein beliebtes Monitoring-System ist zudem das allseits bekannte <a href=\"https:\/\/grafana.com\/\">Grafana<\/a>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Zusammenfassung\"><\/span>Zusammenfassung<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Mit einer Mischung aus .NET Core und der Public Cloud in Form von Azure-Diensten f\u00fchlen wir uns sehr wohl. Auch wenn es einige andere Kombinationsm\u00f6glichkeiten gibt, die auch .NET-Entwicklung und -Hosting unterst\u00fctzen, schlie\u00dft hier interessanterweise an erster Stelle\u00a0Microsoft selbst den Kreis, und das, obwohl ein gro\u00dfer Faktor f\u00fcr seine Beliebtheit bei uns die Cross-Platform-F\u00e4higkeit von .NET Core ist.<\/p>\n<p>Wir haben hier versucht euch einen \u00dcberblick \u00fcber die technischen Komponenten eines <em>typischen Projektes<\/em> bei uns im Haus zu geben. Dabei haben wir bewusst nicht jeden Aspekt beleuchtet \u2013 auch weil es vereinzelt keine typische Wahl gibt. Wir hoffen, wir konnten euch einen guten Einblick geben!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In dieser Artikelserie m\u00f6chten wir euch einen Einblick geben, wie typische Projekte aus technologischer Sicht bei uns aussehen. Wir betrachten dazu in einzelnen kurzen Artikeln unterschiedliche Tech-Stacks. Wir ber\u00fccksichtigen dabei auf keinen Fall all unsere Projekte, m\u00f6chten aber zeigen, wie viele oder gar die meisten j\u00fcngeren Projekte in diesem Bereich aufgebaut sind. Es geht uns [&hellip;]<\/p>\n","protected":false},"author":138,"featured_media":19084,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[68],"service":[420],"coauthors":[{"id":138,"display_name":"Daniel Schreier","user_nicename":"dschreier"}],"class_list":["post-21121","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-backend","service-apps"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Backend Tech Stacks: .NET Core - inovex GmbH<\/title>\n<meta name=\"description\" content=\".NET Core wird in vielen unserer Projekte mit Backend-Anteil eingesetzt. In diesem Artikel wollen wir euch den typischen Tech Stack solcher Projekte bei uns n\u00e4her bringen. Dies ist einer der Artikel aus der Serie \u201eBackend Tech Stacks\u201c.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Backend Tech Stacks: .NET Core - inovex GmbH\" \/>\n<meta property=\"og:description\" content=\".NET Core wird in vielen unserer Projekte mit Backend-Anteil eingesetzt. In diesem Artikel wollen wir euch den typischen Tech Stack solcher Projekte bei uns n\u00e4her bringen. Dies ist einer der Artikel aus der Serie \u201eBackend Tech Stacks\u201c.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2020-06-25T10:35:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-09-27T06:18:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/06\/net-core-tech-stack.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Daniel Schreier\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/06\/net-core-tech-stack-1024x576.png\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Schreier\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"10\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Daniel Schreier\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/backend-tech-stacks-net-core\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/backend-tech-stacks-net-core\\\/\"},\"author\":{\"name\":\"Daniel Schreier\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/3dcec5277d616c22a8bcd132e05266d5\"},\"headline\":\"Backend Tech Stacks: .NET Core\",\"datePublished\":\"2020-06-25T10:35:36+00:00\",\"dateModified\":\"2022-09-27T06:18:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/backend-tech-stacks-net-core\\\/\"},\"wordCount\":2031,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/backend-tech-stacks-net-core\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/net-core-tech-stack.png\",\"keywords\":[\"Backend\"],\"articleSection\":[\"Applications\",\"English Content\",\"General\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/backend-tech-stacks-net-core\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/backend-tech-stacks-net-core\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/backend-tech-stacks-net-core\\\/\",\"name\":\"Backend Tech Stacks: .NET Core - inovex GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/backend-tech-stacks-net-core\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/backend-tech-stacks-net-core\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/net-core-tech-stack.png\",\"datePublished\":\"2020-06-25T10:35:36+00:00\",\"dateModified\":\"2022-09-27T06:18:15+00:00\",\"description\":\".NET Core wird in vielen unserer Projekte mit Backend-Anteil eingesetzt. In diesem Artikel wollen wir euch den typischen Tech Stack solcher Projekte bei uns n\u00e4her bringen. Dies ist einer der Artikel aus der Serie \u201eBackend Tech Stacks\u201c.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/backend-tech-stacks-net-core\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/backend-tech-stacks-net-core\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/backend-tech-stacks-net-core\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/net-core-tech-stack.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/net-core-tech-stack.png\",\"width\":1920,\"height\":1080,\"caption\":\".NET Core Tech Stack\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/backend-tech-stacks-net-core\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Backend Tech Stacks: .NET Core\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/3dcec5277d616c22a8bcd132e05266d5\",\"name\":\"Daniel Schreier\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c528335d505d7f130b20e35aaf89128199bd030768fffdda98423a4ddc19877c?s=96&d=retro&r=ga11a42c606092f7ee403db62eade98be\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c528335d505d7f130b20e35aaf89128199bd030768fffdda98423a4ddc19877c?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c528335d505d7f130b20e35aaf89128199bd030768fffdda98423a4ddc19877c?s=96&d=retro&r=g\",\"caption\":\"Daniel Schreier\"},\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/dschreier\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Backend Tech Stacks: .NET Core - inovex GmbH","description":".NET Core wird in vielen unserer Projekte mit Backend-Anteil eingesetzt. In diesem Artikel wollen wir euch den typischen Tech Stack solcher Projekte bei uns n\u00e4her bringen. Dies ist einer der Artikel aus der Serie \u201eBackend Tech Stacks\u201c.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/","og_locale":"de_DE","og_type":"article","og_title":"Backend Tech Stacks: .NET Core - inovex GmbH","og_description":".NET Core wird in vielen unserer Projekte mit Backend-Anteil eingesetzt. In diesem Artikel wollen wir euch den typischen Tech Stack solcher Projekte bei uns n\u00e4her bringen. Dies ist einer der Artikel aus der Serie \u201eBackend Tech Stacks\u201c.","og_url":"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2020-06-25T10:35:36+00:00","article_modified_time":"2022-09-27T06:18:15+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/06\/net-core-tech-stack.png","type":"image\/png"}],"author":"Daniel Schreier","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/06\/net-core-tech-stack-1024x576.png","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Daniel Schreier","Gesch\u00e4tzte Lesezeit":"10\u00a0Minuten","Written by":"Daniel Schreier"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/"},"author":{"name":"Daniel Schreier","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/3dcec5277d616c22a8bcd132e05266d5"},"headline":"Backend Tech Stacks: .NET Core","datePublished":"2020-06-25T10:35:36+00:00","dateModified":"2022-09-27T06:18:15+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/"},"wordCount":2031,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/06\/net-core-tech-stack.png","keywords":["Backend"],"articleSection":["Applications","English Content","General"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/","url":"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/","name":"Backend Tech Stacks: .NET Core - inovex GmbH","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/06\/net-core-tech-stack.png","datePublished":"2020-06-25T10:35:36+00:00","dateModified":"2022-09-27T06:18:15+00:00","description":".NET Core wird in vielen unserer Projekte mit Backend-Anteil eingesetzt. In diesem Artikel wollen wir euch den typischen Tech Stack solcher Projekte bei uns n\u00e4her bringen. Dies ist einer der Artikel aus der Serie \u201eBackend Tech Stacks\u201c.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/06\/net-core-tech-stack.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/06\/net-core-tech-stack.png","width":1920,"height":1080,"caption":".NET Core Tech Stack"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/backend-tech-stacks-net-core\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Backend Tech Stacks: .NET Core"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/3dcec5277d616c22a8bcd132e05266d5","name":"Daniel Schreier","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/c528335d505d7f130b20e35aaf89128199bd030768fffdda98423a4ddc19877c?s=96&d=retro&r=ga11a42c606092f7ee403db62eade98be","url":"https:\/\/secure.gravatar.com\/avatar\/c528335d505d7f130b20e35aaf89128199bd030768fffdda98423a4ddc19877c?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c528335d505d7f130b20e35aaf89128199bd030768fffdda98423a4ddc19877c?s=96&d=retro&r=g","caption":"Daniel Schreier"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/dschreier\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/21121","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/138"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=21121"}],"version-history":[{"count":2,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/21121\/revisions"}],"predecessor-version":[{"id":38530,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/21121\/revisions\/38530"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/19084"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=21121"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=21121"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=21121"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=21121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}