Häufig verwendete WebanwendungsarchitekturenCommon web application architectures

„Wenn Sie denken, dass eine gute Architektur viel Geld kostet, dann haben Sie noch nicht mit einer schlechten gearbeitet.“"If you think good architecture is expensive, try bad architecture."
– Brian Foote und Joseph Yoder- Brian Foote and Joseph Yoder

Die meisten herkömmlichen .NET-Anwendungen werden als einzelne Einheiten bereitgestellt, die einer ausführbaren Datei oder einer Webanwendung entsprechen, die innerhalb einer IIS-Anwendungsdomäne ausgeführt wird.Most traditional .NET applications are deployed as single units corresponding to an executable or a single web application running within a single IIS appdomain. Dabei handelt es sich um das wohl einfachste Bereitstellungsmodell, das sich gut für interne und kleinere öffentliche Anwendungen eignet.This is the simplest deployment model and serves many internal and smaller public applications very well. Allerdings eignet sich für die meisten wichtigen Geschäftsanwendungen sogar mit dieser einzelnen Bereitstellungseinheit die logische Unterteilung in mehrere Schichten.However, even given this single unit of deployment, most non-trivial business applications benefit from some logical separation into several layers.

Was sind monolithische Anwendungen?What is a monolithic application?

Monolithische Anwendungen sind in Bezug auf ihr Verhalten vollkommen unabhängig.A monolithic application is one that is entirely self-contained, in terms of its behavior. Sie interagieren zwar möglichweise mit anderen Diensten oder Datenspeichern, während sie Vorgänge ausführen, aber der Hauptbestandteil ihres Verhaltens liegt in ihren eigenen Prozessen, und die gesamte Anwendung wird in der Regel als einzelne Einheit bereitgestellt.It may interact with other services or data stores in the course of performing its operations, but the core of its behavior runs within its own process and the entire application is typically deployed as a single unit. Wenn eine solche Anwendung eine horizontale Skalierung vornehmen muss, wird in der Regel die gesamte Anwendung auf mehreren Servern oder virtuellen Computern dupliziert.If such an application needs to scale horizontally, typically the entire application is duplicated across multiple servers or virtual machines.

All-in-One-AnwendungenAll-in-one applications

Jede Anwendungsarchitektur muss mindestens ein Projekt umfassen.The smallest possible number of projects for an application architecture is one. In dieser Architektur ist die gesamte Logik der Anwendung in nur einem Projekt enthalten. Außerdem wird sie in nur eine Assembly kompiliert und als einzelne Einheit bereitgestellt.In this architecture, the entire logic of the application is contained in a single project, compiled to a single assembly, and deployed as a single unit.

Wenn ein neues ASP.NET Core-Projekt erstellt wird, stellt dieses anfangs immer einen All-in-One-Monolith dar. Dabei macht es keinen Unterschied, ob es über Visual Studio oder die Befehlszeile erstellt wird.A new ASP.NET Core project, whether created in Visual Studio or from the command line, starts out as a simple "all-in-one" monolith. Dieser Monolith enthält das gesamte Verhalten der Anwendung, einschließlich der Darstellungs-, Geschäfts- und Datenzugriffslogik.It contains all of the behavior of the application, including presentation, business, and data access logic. In Abbildung 5-1 wird die Dateistruktur einer App dargestellt, die aus einem Projekt besteht.Figure 5-1 shows the file structure of a single-project app.

Eine ASP.NET Core-App, die nur aus einem Projekt besteht

Abbildung 5-1.Figure 5-1. Eine ASP.NET Core-App, die nur aus einem Projekt besteht.A single project ASP.NET Core app.

Wenn eine App nur aus einem Projekt besteht, wird das Prinzip „Separation of Concerns“ durch die Verwendung von Ordnern unterstützt.In a single project scenario, separation of concerns is achieved through the use of folders. Die Standardvorlage enthält separate Ordner für Verantwortlichkeiten von MVC-Mustern für Modelle, Ansichten und Controller sowie zusätzliche Ordner für Daten und Dienste.The default template includes separate folders for MVC pattern responsibilities of Models, Views, and Controllers, as well as additional folders for Data and Services. Wenn Sie diese Vorlage verwenden, sollten Darstellunsgdetails weitestgehend auf den Ansichtenordner (Views) beschränkt sein, und Implementierungsdetails zum Datenzugriff sollten auf Klassen beschränkt sein, die im Datenordner (Data) gespeichert werden.In this arrangement, presentation details should be limited as much as possible to the Views folder, and data access implementation details should be limited to classes kept in the Data folder. Die Geschäftslogik sollte in Diensten und Klassen gespeichert sein, die im Modellordner (Models) enthalten sind.Business logic should reside in services and classes within the Models folder.

Diese monolithische Projektmappe, die aus nur einem Projekt besteht, ist zwar sehr einfach strukturiert, weist aber auch einige Nachteile auf.Although simple, the single-project monolithic solution has some disadvantages. Wenn der Umfang des Projekts ausgeweitet wird, entstehen auch immer mehr Dateien und Ordner.As the project's size and complexity grows, the number of files and folders will continue to grow as well. Elemente, die die Benutzeroberfläche (UI) betreffen (z.B. Modelle, Ansichten und Controller), sind in unterschiedlichen Ordnern gespeichert, die nicht gemeinsam in alphabetischer Reihenfolge sortiert sind.User interface (UI) concerns (models, views, controllers) reside in multiple folders, which aren't grouped together alphabetically. Dieses Problem wird noch größer, wenn zusätzliche Konstrukte auf Benutzeroberflächenebene wie Filter oder ModelBinders-Elemente zu ihren jeweiligen Ordnern hinzugefügt werden.This issue only gets worse when additional UI-level constructs, such as Filters or ModelBinders, are added in their own folders. Die Geschäftslogik ist auf die Ordner „Models“ und „Services“ aufgeteilt, und es gibt keinen Anhaltspunkt dafür, welche Klassen in welchen Ordnern von welchen anderen Elementen abhängig sein sollen.Business logic is scattered between the Models and Services folders, and there's no clear indication of which classes in which folders should depend on which others. Dadurch, dass auf Projektebene keine Sortierung vorgenommen wird, wird der Code häufig unübersichtlich, und es entsteht sogenannter Spaghetticode.This lack of organization at the project level frequently leads to spaghetti code.

Um diese Probleme zu umgehen, greifen Entwickler häufig auf die Möglichkeit zurück, Anwendungen in Projektmappen mit mehreren Projekten auszuweiten. In diesen Projektmappen ist dann jedes Projekt auf einer bestimmten Schicht einer Anwendung gespeichert.To address these issues, applications often evolve into multi-project solutions, where each project is considered to reside in a particular layer of the application.

Was sind Schichten?What are layers?

Wenn eine Anwendung immer komplexer wird, können Sie dagegen vorgehen, indem Sie sie anhand ihrer Zuständigkeiten und Aufgaben aufteilen.As applications grow in complexity, one way to manage that complexity is to break up the application according to its responsibilities or concerns. Dieses Prinzip wird als „Separation of Concerns“ (Trennung von Belangen) bezeichnet und hilft Ihnen dabei, die Codebasis zu ordnen, damit Sie problemlos feststellen können, an welcher Stelle bestimmte Funktionalität implementiert wurde.This follows the separation of concerns principle and can help keep a growing codebase organized so that developers can easily find where certain functionality is implemented. Die Strukturierung Ihres Codes ist aber nicht der einzige Vorteil einer aus Schichten bestehenden Architektur.Layered architecture offers a number of advantages beyond just code organization, though.

Wenn Sie Code in Schichten unterteilen, können häufig verwendete grundlegende Funktionen in der gesamten Anwendung wiederverwendet werden.By organizing code into layers, common low-level functionality can be reused throughout the application. Dies hat den Vorteil, dass Sie weniger Code schreiben müssen und die Anwendung für eine Implementierung standardisiert wird, was dem Don‘t Repeat Yourself-Prinzip entspricht.This reuse is beneficial because it means less code needs to be written and because it can allow the application to standardize on a single implementation, following the don't repeat yourself (DRY) principle.

Wenn eine Architektur aus Schichten besteht, können Anwendungen Einschränkungen für die Kommunikation zwischen den einzelnen Schichten erzwingen.With a layered architecture, applications can enforce restrictions on which layers can communicate with other layers. Dies erleichtert die Kapselung.This helps to achieve encapsulation. Wenn eine Schicht geändert oder ersetzt wird, sollten nur die Schichten betroffen sein, die mit dieser zusammenarbeiten.When a layer is changed or replaced, only those layers that work with it should be impacted. Wenn Sie einschränken, welche Schichten voneinander abhängig sind, können die Auswirkungen von Änderungen verringert werden, sodass eine einzige Änderung nicht die gesamte Anwendung betrifft.By limiting which layers depend on which other layers, the impact of changes can be mitigated so that a single change doesn't impact the entire application.

Schichten (und die Kapselung) vereinfachen das Ersetzen von Funktionen innerhalb der Anwendung.Layers (and encapsulation) make it much easier to replace functionality within the application. Möglicherweise verwendet z.B. eine Anwendung anfangs ihre eigene SQL Server-Datenbank als Persistenzspeicher. Sie können sich dann später aber immer noch dafür entscheiden, eine cloudbasierte Persistenzstrategie oder eine Web-API zu verwenden.For example, an application might initially use its own SQL Server database for persistence, but later could choose to use a cloud-based persistence strategy, or one behind a web API. Wenn die Anwendungen ihre Persistenzimplementierungen innerhalb einer logischen Schicht kapseln, kann diese SQL Server-spezifische Schicht durch eine neue Implementierung derselben öffentlichen Schnittstelle ersetzt werden.If the application has properly encapsulated its persistence implementation within a logical layer, that SQL Server specific layer could be replaced by a new one implementing the same public interface.

Neben der Möglichkeit, Implementierungen auszutauschen, um möglichen zukünftigen Änderungen von Anforderungen vorzubeugen, können diese mithilfe von Anwendungsschichten auch zu Testzwecken ausgetauscht werden.In addition to the potential of swapping out implementations in response to future changes in requirements, application layers can also make it easier to swap out implementations for testing purposes. Die Schichten können während der Tests durch falsche Implementierungen ersetzt werden, die bekannte Antworten auf Anforderungen bereitstellen, sodass Sie keine Tests mehr schreiben müssen, die mit der echten Daten- oder Benutzeroberflächenschicht der Anwendung arbeiten.Instead of having to write tests that operate against the real data layer or UI layer of the application, these layers can be replaced at test time with fake implementations that provide known responses to requests. Dadurch können Tests einfacher geschrieben und im Vergleich zu Tests der echten Infrastruktur der Anwendung schneller ausgeführt werden.This typically makes tests much easier to write and much faster to run when compared to running tests against the application's real infrastructure.

Das Erstellen logischer Schichten ist eine häufig verwendete Technik zum Verbessern der Strukturierung von Code in Unternehmensanwendungen. Es gibt mehrere Möglichkeiten, Code in Schichten zu strukturieren.Logical layering is a common technique for improving the organization of code in enterprise software applications, and there are several ways in which code can be organized into layers.

Hinweis

Schichten stellen eine logische Unterteilung aller Bestandteile einer App dar.Layers represent logical separation within the application. Wenn die Anwendungslogik physisch auf separate Server oder Prozesse verteilt wird, werden diese separaten Bereitstellunsgsziele als Ebenen bezeichnet.In the event that application logic is physically distributed to separate servers or processes, these separate physical deployment targets are referred to as tiers. Die Verwendung einer Anwendung mit mehreren Schichten, die für eine einzelne Schicht bereitgestellt wird, ist möglich und wird häufig angewandt.It's possible, and quite common, to have an N-Layer application that is deployed to a single tier.

Traditionelle Architektur einer Anwendung mit mehreren SchichtenTraditional "N-Layer" architecture applications

In Abbildung 5-2 wird die am häufigsten verwendete Unterteilung einer Anwendungslogik in Schichten dargestellt.The most common organization of application logic into layers is shown in Figure 5-2.

Typische Anwendungsschichten

Abbildung 5-2.Figure 5-2. Typische AnwendungsschichtenTypical application layers.

Diese Schichten werden häufig mit den englischen Abkürzungen UI für User Interface (Benutzeroberfläche), BLL für Business Logic Layer (Schicht der Geschäftslogik) und DAL für Data Access Layer (Schicht für den Datenzugriff) bezeichnet.These layers are frequently abbreviated as UI, BLL (Business Logic Layer), and DAL (Data Access Layer). Wenn diese Architektur verwendet wird, senden Benutzer Anforderungen über die Benutzeroberflächenschicht, die nur mit der BLL interagiert.Using this architecture, users make requests through the UI layer, which interacts only with the BLL. Die BLL kann wiederum die DAL für Anforderungen hinsichtlich des Datenzugriffs aufrufen.The BLL, in turn, can call the DAL for data access requests. Die UI-Schicht sollte keine direkten Anforderungen an die DAL senden oder direkt mithilfe anderer Methoden mit der Persistenz interagieren.The UI layer shouldn't make any requests to the DAL directly, nor should it interact with persistence directly through other means. Gleichzeitig sollte die BLL nur über die DAL mit der Persistenz interagieren.Likewise, the BLL should only interact with persistence by going through the DAL. Auf diese Weise wird jeder Schicht eine individuelle bekannte Verantwortlichkeit zugewiesen.In this way, each layer has its own well-known responsibility.

Dieser traditionelle Ansatz zum Erstellen von Schichten hat allerdings den Nachteil, dass Abhängigkeiten zur Kompilierzeit von oben nach unten ausgeführt werden.One disadvantage of this traditional layering approach is that compile-time dependencies run from the top to the bottom. Das heißt, die UI-Schicht ist von der BLL abhängig, die wiederum von der DAL abhängig ist.That is, the UI layer depends on the BLL, which depends on the DAL. Das wiederum bedeutet, dass die BLL, die in der Regel die wichtigste Logik innerhalb der Anwendung aufweist, von den Implementierungsdetails zum Datenzugriff abhängig ist (und dadurch häufig auch eine Datenbank benötigt).This means that the BLL, which usually holds the most important logic in the application, is dependent on data access implementation details (and often on the existence of a database). Das Testen einer Geschäftslogik in einer Architektur wie dieser gestaltet sich häufig als schwierig und erfordert eine Testdatenbank.Testing business logic in such an architecture is often difficult, requiring a test database. Sie können dieses Problem wie im nächsten Abschnitt beschrieben mit dem Dependency Inversion-Prinzip angehen.The dependency inversion principle can be used to address this issue, as you'll see in the next section.

In Abbildung 5-3 wird eine Projektmappe als Beispiel dargestellt, in der die Anwendung anhand von Zuständigkeiten bzw. Schichten in drei Projekte unterteilt wird.Figure 5-3 shows an example solution, breaking the application into three projects by responsibility (or layer).

Eine einfache monolithische Anwendung mit drei Projekten

Abbildung 5-3.Figure 5-3. Eine einfache monolithische Anwendung mit drei ProjektenA simple monolithic application with three projects.

Obwohl diese Anwendung aus Strukturierungsgründen mehrere Projekte verwendet, wird sie als einzelne Einheit bereitgestellt, und ihre Clients interagieren mit ihr wie mit einer einzelnen Web-App.Although this application uses several projects for organizational purposes, it's still deployed as a single unit and its clients will interact with it as a single web app. Dies vereinfacht die Bereitstellung.This allows for very simple deployment process. In Abbildung 5-4 wird dargestellt, wie eine solche App unter Verwendung von Azure gehostet werden kann.Figure 5-4 shows how such an app might be hosted using Azure.

Einfache Bereitstellung einer Azure-Web-App

Abbildung 5-4.Figure 5-4. Einfache Bereitstellung einer Azure-Web-AppSimple deployment of Azure Web App

Wenn die Anforderungen an eine App höher werden, ist möglicherweise eine komplexere und robustere Bereitstellungslösung erforderlich.As application needs grow, more complex and robust deployment solutions may be required. In Abbildung 5-5 ist ein Beispiel einer komplexeren Bereitstellung dargestellt, die mehrere zusätzliche Funktionen unterstützt.Figure 5-5 shows an example of a more complex deployment plan that supports additional capabilities.

Bereitstellen einer Web-App in Azure App Service

Abbildung 5-5.Figure 5-5. Bereitstellen einer Web-App in Azure App ServiceDeploying a web app to an Azure App Service

Innerhalb der Anwendung verbessert diese Unterteilung in mehrere Projekte anhand von Zuständigkeiten deren Verwaltbarkeit.Internally, this project's organization into multiple projects based on responsibility improves the maintainability of the application.

Diese Einheit kann zentral oder horizontal hochskaliert werden, um die cloudbasierte bedarfsgesteuerte Skalierbarkeit zu nutzen.This unit can be scaled up or out to take advantage of cloud-based on-demand scalability. Beim zentralen Hochskalieren werden zusätzliche CPU, zusätzlicher Arbeitsspeicher, zusätzlicher Speicherplatz auf dem Datenträger oder andere Ressourcen zu dem Server bzw. den Servern hinzugefügt, der bzw. die Ihre App hosten.Scaling up means adding additional CPU, memory, disk space, or other resources to the server(s) hosting your app. Beim horizontalen Hochskalieren werden zusätzliche Instanzen solcher Server hinzugefügt. Dabei macht es keinen Unterschied, ob es sich um physische Server, virtuelle Computer oder Container handelt.Scaling out means adding additional instances of such servers, whether these are physical servers, virtual machines, or containers. Wenn Ihre App auf mehreren Instanzen gehostet wird, wird ein Lastenausgleich vorgenommen, um individuellen App-Instanzen Anforderungen zuzuweisen.When your app is hosted across multiple instances, a load balancer is used to assign requests to individual app instances.

Der einfachste Ansatz zum Skalieren einer Webanwendung in Azure ist das manuelle Konfigurieren einer Skalierung im App Service-Plan der Anwendung.The simplest approach to scaling a web application in Azure is to configure scaling manually in the application's App Service Plan. In Abbildung 5-6 wird die Anzeige des Azure-Dashboards dargestellt, über die Sie konfigurieren können, wie viele Instanzen einer App zugrunde liegen.Figure 5-6 shows the appropriate Azure dashboard screen to configure how many instances are serving an app.

Skalieren des App Service-Plans in Azure

Abbildung 5-6.Figure 5-6. Skalieren des App Service-Plans in AzureApp Service Plan scaling in Azure.

Clean ArchitectureClean architecture

Anwendungen, die den Prinzipien der Abhängigkeitsumkehr und des domänengesteuerten Entwurfs (DDD) folgen, weisen alle eine ähnliche Architektur auf.Applications that follow the Dependency Inversion Principle as well as the Domain-Driven Design (DDD) principles tend to arrive at a similar architecture. Diese Architektur wurde in den vergangenen Jahren unterschiedlich benannt.This architecture has gone by many names over the years. Zuerst wurde diese Architektur als „Hexagonal Architecture“ bezeichnet. Darauf folgte der Begriff „Ports-and-Adapters“.One of the first names was Hexagonal Architecture, followed by Ports-and-Adapters. Heutzutage spricht man aber eher von Onion Architecture bzw. Clean Architecture.More recently, it's been cited as the Onion Architecture or Clean Architecture. Der zweite Name, „Clean Architecture“, wird in diesem E-Book als Name dieser Architektur verwendet.The latter name, Clean Architecture, is used as the name for this architecture in this e-book.

Die Referenzanwendung eShopOnWeb befolgt den Ansatz der Clean Architecture bei der Aufteilung des Codes in Projekte.The eShopOnWeb reference application uses the Clean Architecture approach in organizing its code into projects. Eine Projektmappenvorlage, die Sie als Ausgangspunkt für Ihren eigenen ASP.NET Core-Code verwenden können, finden Sie im GitHub-Repository ardalis/cleanarchitecture.You can find a solution template you can use as a starting point for your own ASP.NET Core on the ardalis/cleanarchitecture GitHub repository.

In der Clean Architecture sind die Geschäftslogik und das Anwendungsmodell im Kern der Anwendung enthalten.Clean architecture puts the business logic and application model at the center of the application. Es wird dann das Prinzip Dependency Inversion angewendet, bei dem die Geschäftslogik nicht mehr vom Datenzugriff oder anderen Aufgaben, die die Infrastruktur betreffen, abhängig ist. Stattdessen sind die Informationen zur Infrastruktur und Implementierung vom Anwendungskern abhängig.Instead of having business logic depend on data access or other infrastructure concerns, this dependency is inverted: infrastructure and implementation details depend on the Application Core. Dafür werden Abstraktionen oder Schnittstellen im Anwendungskern definiert und anschließend anhand von Typen implementiert, die in der Infrastrukturschicht definiert werden.This is achieved by defining abstractions, or interfaces, in the Application Core, which are then implemented by types defined in the Infrastructure layer. Diese Architektur wird häufig in Kreisringen dargestellt, die dem Aufbau einer Zwiebel ähneln.A common way of visualizing this architecture is to use a series of concentric circles, similar to an onion. In Abbildung 5-7 ist ein Beispiel für die Darstellung der Architektur enthalten.Figure 5-7 shows an example of this style of architectural representation.

Clean Architecture: „Zwiebelansicht“

Abbildung 5-7.Figure 5-7. Clean Architecture: „Zwiebelansicht“Clean Architecture; onion view

In diesem Diagramm beziehen sich alle Abhängigkeiten auf den inneren Kreisring, also auf den Anwendungskern.In this diagram, dependencies flow toward the innermost circle. Der Anwendungskern erhält seinen Namen aufgrund seiner Position im Zentrum des Diagramms.The Application Core takes its name from its position at the core of this diagram. Auf dem Diagramm können Sie auch sehen, dass der Anwendungskern über keine Abhängigkeiten von anderen Anwendungsschichten verfügt.And you can see on the diagram that the Application Core has no dependencies on other application layers. Die Entitäten und Schnittstellen der Anwendung stehen im Mittelpunkt.The application's entities and interfaces are at the very center. Domänendienste, die in der Regel Schnittstellen implementieren, die im inneren Kreisring definiert sind, befinden sich am äußeren Rand des Anwendungskerns.Just outside, but still in the Application Core, are domain services, which typically implement interfaces defined in the inner circle. Außerhalb des Anwendungskerns sind sowohl die Benutzeroberfläche als auch die Infrastrukturebenen zwar vom Anwendungskern, aber nicht (unbedingt) voneinander abhängig.Outside of the Application Core, both the UI and the Infrastructure layers depend on the Application Core, but not on one another (necessarily).

In Abbildung 5-8 wird ein herkömmlicheres horizontales Schichtendiagramm dargestellt, das die Abhängigkeit zwischen Benutzeroberfläche und anderen Schichten besser darstellt.Figure 5-8 shows a more traditional horizontal layer diagram that better reflects the dependency between the UI and other layers.

Clean Architecture: Ansicht mit horizontalen Schichten

Abbildung 5-8.Figure 5-8. Clean Architecture: Ansicht mit horizontalen SchichtenClean Architecture; horizontal layer view

Beachten Sie, dass die Pfeile mit durchgezogener Linie Abhängigkeiten zur Kompilierzeit darstellen. Die Pfeile mit gestrichelten Linien stellen Abhängigkeiten dar, die nur zur Laufzeit bestehen.Note that the solid arrows represent compile-time dependencies, while the dashed arrow represents a runtime-only dependency. Unter Verwendung von Clean Architecture funktioniert die UI-Schicht nur mit Schnittstellen, die zur Kompilierzeit im Anwendungskern definiert werden. Im Idealfall sollten diese außerdem nicht über Informationen zu den in der Infrastrukturebene definierten Implementierungstypen verfügen.With the clean architecture, the UI layer works with interfaces defined in the Application Core at compile time, and ideally shouldn't know about the implementation types defined in the Infrastructure layer. Zur Laufzeit sind diese Implementierungstypen jedoch erforderlich, damit die App ausgeführt werden kann. Daher müssen sie definiert und über Dependency Injection mit den Schnittstellen des Anwendungskerns verbunden sein.At run time, however, these implementation types are required for the app to execute, so they need to be present and wired up to the Application Core interfaces via dependency injection.

In Abbildung 5-9 wird eine detailliertere Ansicht der Architektur einer ASP.NET Core-Anwendung dargestellt, die anhand dieser Empfehlungen erstellt wurde.Figure 5-9 shows a more detailed view of an ASP.NET Core application's architecture when built following these recommendations.

Diagramm der ASP.NET Core-Architektur, die dem Prinzip der Clean Architecture folgt

Abbildung 5-9.Figure 5-9. Diagramm der ASP.NET Core-Architektur, die dem Prinzip der Clean Architecture folgtASP.NET Core architecture diagram following Clean Architecture.

Da der Anwendungskern nicht von der Infrastrukturebene abhängig ist, ist es leicht, automatisierte Komponententests für diese Schicht zu schreiben.Because the Application Core doesn't depend on Infrastructure, it's very easy to write automated unit tests for this layer. In den Abbildungen 5-10 und 5-11 wird dargestellt, wie Tests mit dieser Architektur in Einklang gebracht werden können.Figures 5-10 and 5-11 show how tests fit into this architecture.

UnitTestCore

Abbildung 5-10.Figure 5-10. Isolierter Komponententest des AnwendungskernsUnit testing Application Core in isolation.

IntegrationTests

Abbildung 5-11.Figure 5-11. Integrationstest von Infrastrukturimplementierungen mit externen AbhängigkeitenIntegration testing Infrastructure implementations with external dependencies.

Da die UI-Schicht nicht über direkte Abhängigkeiten von im Infrastrukturprojekt definierten Typen verfügt, können Implementierungen leicht ausgetauscht werden. Dadurch kann das Testen vereinfacht werden, oder sich ändernde Anwendungsanforderungen lassen sich leichter umsetzen.Since the UI layer doesn't have any direct dependency on types defined in the Infrastructure project, it's likewise very easy to swap out implementations, either to facilitate testing or in response to changing application requirements. Durch die in ASP.NET Core integrierte Verwendung von und Unterstützung für Dependency Injection eignet sich diese Architektur besonders gut zum Strukturieren wichtiger monolithischer Anwendungen.ASP.NET Core's built-in use of and support for dependency injection makes this architecture the most appropriate way to structure non-trivial monolithic applications.

Bei monolithischen Anwendungen werden Projekte für den Anwendungskern, die Infrastruktur und die Benutzeroberfläche als einzelne Anwendung ausgeführt.For monolithic applications the Application Core, Infrastructure, and UI projects are all run as a single application. Die Anwendungsarchitektur zur Laufzeit sieht in etwa wie in Abbildung 5-12 dargestellt aus.The runtime application architecture might look something like Figure 5-12.

ASP.NET Core-Architektur 2

Abbildung 5-12.Figure 5-12. Beispiel für die Laufzeitarchitektur einer ASP.NET Core-AppA sample ASP.NET Core app's runtime architecture.

Strukturieren von Code anhand des Clean Architecture-PrinzipsOrganizing code in Clean Architecture

In einer gemäß der Clean Architecture erstellten Projektmappe verfügt jedes Projekt über klare Zuständigkeiten.In a Clean Architecture solution, each project has clear responsibilities. Daher gehören zu jedem Projekt bestimmte Typen, und häufig entsprechen Ordner im jeweiligen Projekt diesen Typen.As such, certain types belong in each project and you'll frequently find folders corresponding to these types in the appropriate project.

Der Anwendungskern enthält das Geschäftsmodell, das wiederum Entitäten, Dienste und Schnittstellen umfasst.The Application Core holds the business model, which includes entities, services, and interfaces. Diese Schnittstellen umfassen Abstraktionen für Vorgänge, die unter Verwendung der Infrastruktur ausgeführt werden. Damit sind z.B. der Datenzugriff, der Zugriff auf Dateisysteme und Netzwerkaufrufe gemeint. Gelegentlich müssen für diese Schicht installierte Dienste und Schnittstellen mit Typen zusammenarbeiten, bei denen es sich nicht um Entitäten handelt und die nicht von der Benutzeroberfläche oder der Infrastruktur abhängig sind.These interfaces include abstractions for operations that will be performed using Infrastructure, such as data access, file system access, network calls, etc. Sometimes services or interfaces defined at this layer will need to work with non-entity types that have no dependencies on UI or Infrastructure. Diese Dienste und Schnittstellen können als einfache Datentransferobjekte (Data Transfer Objects, DTOs) definiert sein.These can be defined as simple Data Transfer Objects (DTOs).

Typen des AnwendungskernsApplication Core types

  • Entitäten (Klassen von Geschäftsmodellen, die dauerhaft gespeichert werden)Entities (business model classes that are persisted)
  • SchnittstellenInterfaces
  • DiensteServices
  • DTOsDTOs

Das Infrastrukturprojekt umfasst in der Regel Implementierungen für den Datenzugriff.The Infrastructure project typically includes data access implementations. In einer herkömmlichen ASP.NET Core-Webanwendung umfassen diese Implementierungen die Entity Framework-Klasse „DbContext“, jegliche Migration-Objekte von EF Core, die definiert wurden, und Klassen für die Implementierungen des Datenzugriffs.In a typical ASP.NET Core web application, these implementations include the Entity Framework (EF) DbContext, any EF Core Migration objects that have been defined, and data access implementation classes. Die beste Möglichkeit, Implementierungscode für den Datenzugriff zu implementieren, stellt das Entwurfsmuster Repository dar.The most common way to abstract data access implementation code is through the use of the Repository design pattern.

Das Infrastrukturprojekt sollte neben Implementierungen für den Datenzugriff Implementierungen von Diensten enthalten, die mit verschiedenen Bestandteilen der Infrastruktur interagieren.In addition to data access implementations, the Infrastructure project should contain implementations of services that must interact with infrastructure concerns. Diese Dienste sollten im Anwendungskern definierte Schnittstellen implementierten. Daher sollte im Infrastrukturprojekt ein Verweis auf das Anwendungskernprojekt enthalten sein.These services should implement interfaces defined in the Application Core, and so Infrastructure should have a reference to the Application Core project.

Typen der InfrastrukturInfrastructure types

  • EF Core-Typen (DbContext, Migration)EF Core types (DbContext, Migration)
  • Implementierungstypen für den Datenzugriff (Repositorys)Data access implementation types (Repositories)
  • Infrastrukturspezifische Dienste (z.B. FileLogger oder SmtpNotifier)Infrastructure-specific services (for example, FileLogger or SmtpNotifier)

Die UI-Schicht in einer ASP.NET Core MVC-Anwendung stellt den Einstiegspunkt für die Anwendung dar.The user interface layer in an ASP.NET Core MVC application is the entry point for the application. Dieses Projekt sollte auf das Anwendungskernprojekt verweisen, und dessen Typen sollten ausschließlich über im Anwendungskern definierte Schnittstellen mit der Infrastruktur interagieren.This project should reference the Application Core project, and its types should interact with infrastructure strictly through interfaces defined in Application Core. In der UI-Schicht sollten keine direkte Instanziierung oder statische Aufrufe von Typen von Infrastrukturebenen zugelassen werden.No direct instantiation of or static calls to the Infrastructure layer types should be allowed in the UI layer.

Typen der UI-SchichtUI layer types

  • ControllerControllers
  • FilterFilters
  • AnsichtenViews
  • ViewModelsViewModels
  • StartStartup

Die Startup-Klasse ist für das Konfigurieren von Anwendungen und für das Verknüpfen von Implementierungstypen mit Schnittstellen zuständig. Dadurch kann zur Laufzeit erfolgreich Dependency Injection angewendet werden.The Startup class is responsible for configuring the application, and for wiring up implementation types to interfaces, allowing dependency injection to work properly at run time.

Hinweis

Wenn Sie Dependency Injection in ConfigureServices in der Startup.cs-Datei des UI-Projekts durchführen möchten, muss das Projekt möglicherweise auf das Infrastrukturprojekt verweisen.In order to wire up dependency injection in ConfigureServices in the Startup.cs file of the UI project, the project may need to reference the Infrastructure project. Diese Abhängigkeit kann problemlos mithilfe eines benutzerdefinierten Dependency Injection-Containers entfernt werden.This dependency can be eliminated, most easily by using a custom DI container. Im Hinblick auf das hier aufgeführte Beispiel ist es die einfachste Lösung, wenn Sie zulassen, dass das UI-Projekt auf das Infrastrukturprojekt verweist.For the purposes of this sample, the simplest approach is to allow the UI project to reference the Infrastructure project.

Monolithische Anwendungen und ContainerMonolithic applications and containers

Sie können eine einzelne, monolithisch bereitgestellte Webanwendung oder einen Webdienst erstellen und als Container bereitstellen.You can build a single and monolithic-deployment based Web Application or Service and deploy it as a container. Die Anwendung ist in ihrem Inneren möglicherweise nicht monolithisch strukturiert, sondern in mehrere Bibliotheken, Komponenten oder Schichten unterteilt.Within the application, it might not be monolithic but organized into several libraries, components, or layers. Extern ist sie ein einzelner Container, z.B. ein einzelner Prozess, eine einzelne Webanwendung oder ein einzelner Dienst.Externally, it's a single container like a single process, single web application, or single service.

Stellen Sie einen einzelnen Container bereit, der diese Anwendung darstellt, um dieses Modell zu verwalten.To manage this model, you deploy a single container to represent the application. Fügen Sie zum Skalieren einfach weitere Kopien mit einem vorangestellten Lastenausgleich hinzu.To scale, just add additional copies with a load balancer in front. Die Einfachheit stammt aus der Verwaltung einer einzelnen Bereitstellung in einem einzelnen Container oder virtuellen Computer.The simplicity comes from managing a single deployment in a single container or VM.

Abbildung 5-13

Sie können, wie in Abbildung 5-13 veranschaulicht, mehrere Komponenten, Bibliotheken oder interne Schichten in jeden Container einschließen.You can include multiple components/libraries or internal layers within each container, as illustrated in Figure 5-13. Allerdings kann dieses monolithische Muster zu einem Konflikt mit dem Containerprinzip Jeder Container hat nur eine Aufgabe, die er in einem Prozess ausführt führen.But, following the container principle of "a container does one thing, and does it in one process", the monolithic pattern might be a conflict.

Der Nachteil dieses Ansatzes wird offensichtlich, wenn die Anwendung wächst und skaliert werden muss.The downside of this approach comes if/when the application grows, requiring it to scale. Wenn die gesamte Anwendung skaliert werden kann, ist dies kein Problem.If the entire application scales, it's not really a problem. In den meisten Fällen stellen jedoch nur einige Teile der Anwendung Engpässe dar, die eine Skalierung erfordern, während andere Komponente weniger häufig verwendet werden.However, in most cases, a few parts of the application are the choke points requiring scaling, while other components are used less.

Wenn Sie das gewöhnliche eCommerce-Beispiel verwenden, müssen Sie sehr wahrscheinlich die Komponente für die Produktinformationen skalieren.Using the typical eCommerce example, what you likely need to scale is the product information component. Viele Kunden suchen Produkte erst und kaufen sie anschließend.Many more customers browse products than purchase them. Mehr Kunden verwenden Ihren Warenkorb als die Zahlungspipeline.More customers use their basket than use the payment pipeline. Weniger Kunden fügen Kommentare hinzu oder zeigen ihren Bestellungsverlauf an.Fewer customers add comments or view their purchase history. Und Sie haben möglicherweise nur eine Handvoll Mitarbeiter in einer bestimmten Region, die den Inhalt und die Marketingkampagnen verwalten müssen.And you likely only have a handful of employees, in a single region, that need to manage the content and marketing campaigns. Wenn der monolithische Entwurf skaliert wird, wird der gesamte Code mehrmals bereitgestellt.By scaling the monolithic design, all the code is deployed multiple times.

Zusätzlich zu dem Problem, dass „alle Komponenten skaliert werden müssen“, erfordern Änderungen einer einzelnen Komponente einen erneuten Test der gesamten Anwendung und eine vollständige erneute Bereitstellung aller Instanzen.In addition to the "scale everything" problem, changes to a single component require complete retesting of the entire application, and a complete redeployment of all the instances.

Der monolithische Ansatz wird häufig verwendet, und viele Organisationen arbeiten mit dieser Architektur.The monolithic approach is common, and many organizations are developing with this architectural approach. Viele von ihnen erzielen damit akzeptable Ergebnisse, aber andere stoßen an ihre Grenzen.Many are having good enough results, while others are hitting limits. Viele Unternehmen haben ihre Anwendungen unter Verwendung dieses Modells entworfen, da Tools und Infrastruktur schon seit Jahren zu komplex für die Erstellung einer dienstorientierten Architektur (SOA) sind. Sie haben die Notwendigkeit nicht erkannt, etwas zu ändern, bis die Anwendung gewachsen ist.Many designed their applications in this model, because the tools and infrastructure were too difficult to build service-oriented architectures (SOA), and they didn't see the need until the app grew. Wenn Sie an die Grenzen des monolithischen Ansatzes stoßen, ist der nächste logische Schritt das Aufteilen der App, damit diese Container und Microservices besser nutzen kann.If you find you're hitting the limits of the monolithic approach, breaking up the app to enable it to better leverage containers and microservices may be the next logical step.

Abbildung 5-14

Monolithische Anwendungen in Microsoft Azure können mithilfe von dedizierten VMs für jede Instanz bereitgestellt werden.Deploying monolithic applications in Microsoft Azure can be achieved using dedicated VMs for each instance. Sie können die VMs problemlos skalieren, wenn Sie Azure Virtual Machine Scale Sets verwenden.Using Azure Virtual Machine Scale Sets, you can easily scale the VMs. Azure App Service kann auch monolithische Anwendungen ausführen und Instanzen problemlos skalieren, ohne dass die VMs verwaltet werden müssen.Azure App Services can run monolithic applications and easily scale instances without having to manage the VMs. Azure App Services kann ebenfalls einzelne Instanzen von Docker-Containern ausführen, was die Bereitstellung vereinfacht.Azure App Services can run single instances of Docker containers as well, simplifying the deployment. Wenn Sie Docker verwenden, können Sie eine einzelne VM als Docker-Host bereitstellen und mehrere Instanzen ausführen.Using Docker, you can deploy a single VM as a Docker host, and run multiple instances. Wenn Sie wie in Abbildung 5-14 dargestellt den Azure Balancer verwenden, können Sie die Skalierung verwalten.Using the Azure balancer, as shown in the Figure 5-14, you can manage scaling.

Die Bereitstellung auf den verschiedenen Hosts kann mit herkömmlichen Bereitstellungsverfahren verwaltet werden.The deployment to the various hosts can be managed with traditional deployment techniques. Docker-Hosts können manuell mit Befehlen wie docker run oder durch Automatisierung, z.B. Pipelines für Continuous Delivery (CD), verwaltet werden.The Docker hosts can be managed with commands like docker run performed manually, or through automation such as Continuous Delivery (CD) pipelines.

Monolithische Anwendung, die als Container bereitgestellt wirdMonolithic application deployed as a container

Das Verwenden von Containern zur Verwaltung monolithischer Anwendungsbereitstellungen hat einige Vorteile.There are benefits of using containers to manage monolithic application deployments. Das Skalieren von Containerinstanzen ist wesentlich schneller und einfacher als die Bereitstellung zusätzlicher VMs.Scaling the instances of containers is far faster and easier than deploying additional VMs. Auch wenn Virtual Machine Scale Sets verwendet wird, um VMs zu skalieren, nimmt deren Instanziierung viel Zeit in Anspruch.Even when using virtual machine scale sets to scale VMs, they take time to instance. Wenn die App-Konfiguration als App-Instanz bereitgestellt wird, wird diese als Teil der VM verwaltet.When deployed as app instances, the configuration of the app is managed as part of the VM.

Die Bereitstellung von Updates, wie Docker-Images, ist wesentlich schneller und effizienter im Netzwerk.Deploying updates as Docker images is far faster and network efficient. Docker-Images starten in der Regel in Sekunden, wodurch Rollouts beschleunigt werden.Docker Images typically start in seconds, speeding rollouts. Das Löschen einer Docker-Instanz ist genauso einfach wie das Ausführen eines docker stop-Befehls und in der Regel in weniger als einer Sekunde abgeschlossen.Tearing down a Docker instance is as easy as issuing a docker stop command, typically completing in less than a second.

Da Container unveränderlich sind, müssen Sie sich keine Gedanken über beschädigte VMs machen. Es kann allerdings vorkommen, das Updateskripts bestimmte Konfigurationen oder restliche Dateien auf einem Datenträger erfassen.As containers are inherently immutable by design, you never need to worry about corrupted VMs, whereas update scripts might forget to account for some specific configuration or file left on disk.

Sie können Docker-Container für die monolithische Bereitstellung einfacherer Webanwendungen verwenden.You can use Docker containers for monolithic deployment of simpler web applications. Dies verbessert die fortlaufende Integration und die fortlaufenden Bereitstellungspipelines und unterstützt Sie bei der erfolgreichen Bereitstellung in der Produktion.This improves continuous integration and continuous deployment pipelines and helps achieve deployment-to-production success. Sie müssen sich nie wieder fragen, warum die Anwendung auf Ihrem Computer, aber nicht in der Produktion funktioniert.No more “It works on my machine, why does it not work in production?”

Eine auf Microservices basierende Architektur hat viele Vorteile, die jedoch eine erhöhte Komplexität mit sich bringen.A microservices-based architecture has many benefits, but those benefits come at a cost of increased complexity. In manchen Fällen überwiegen die Kosten die Vorteile. Dann ist die monolithische Bereitstellung einer Anwendung, die in einem einzigen oder in wenigen Containern ausgeführt wird, besser geeignet.In some cases, the costs outweigh the benefits, so a monolithic deployment application running in a single container or in just a few containers is a better option.

Eine monolithische Anwendung in gut getrennte Microservices zu zerteilen, ist nicht einfach.A monolithic application might not be easily decomposable into well-separated microservices. Microservices sollten unabhängig voneinander funktionieren, um eine widerstandsfähigere Anwendung bereitzustellen.Microservices should work independently of each other to provide a more resilient application. Wenn Sie keine unabhängigen Feature-Slices der Anwendung bereitstellen können, führt das Trennen derselben nur zu erhöhter Komplexität.If you can't deliver independent feature slices of the application, separating it only adds complexity.

Eine Anwendung muss möglicherweise noch keine Features unabhängig voneinander skalieren.An application might not yet need to scale features independently. Viele Anwendungen können dies mithilfe eines relativ einfachen Prozesses zum Klonen der gesamten Instanz durchführen, wenn sie über eine einzelne Instanz hinaus skaliert werden müssen.Many applications, when they need to scale beyond a single instance, can do so through the relatively simple process of cloning that entire instance. Die zusätzliche Arbeit zum Trennen der Anwendung in diskrete Dienste bietet minimale Vorteile, wenn die Skalierung von vollständigen Instanzen der Anwendung einfach und kosteneffizient ist.The additional work to separate the application into discrete services provides minimal benefit when scaling full instances of the application is simple and cost-effective.

Zu einem frühen Zeitpunkt während der Entwicklung einer Anwendung haben Sie möglicherweise noch keine Vorstellung davon, wo die natürlichen funktionalen Grenzen liegen.Early in the development of an application, you might not have a clear idea where the natural functional boundaries are. Beim Entwickeln eines mindestens anwendungsfähigen Produkts könnte die natürliche Trennung noch nicht verfügbar sein.As you develop a minimum viable product, the natural separation might not yet have emerged. Einige dieser Bedingungen können temporär sein.Some of these conditions might be temporary. Sie können mit dem Erstellen einer monolithischen Anwendung beginnen und später einige Features trennen, damit diese als Microservices entwickelt und bereitgestellt werden.You might start by creating a monolithic application, and later separate some features to be developed and deployed as microservices. Andere Bedingungen können entscheidend für den Problembereich der Anwendung sein. Das bedeutet, dass die Anwendung möglicherweise nicht in mehrere Microservices unterteilt werden kann.Other conditions might be essential to the application's problem space, meaning that the application might never be broken into multiple microservices.

Das Trennen einer Anwendung in viele diskrete Prozesse führt außerdem zu Mehraufwand.Separating an application into many discrete processes also introduces overhead. Durch das Teilen der Features in verschiedene Prozesse wird die Komplexität erhöht.There's more complexity in separating features into different processes. Die Kommunikationsprotokolle werden komplexer.The communication protocols become more complex. Anstelle von Methodenaufrufen müssen Sie asynchrone Kommunikationen zwischen den Diensten verwenden.Instead of method calls, you must use asynchronous communications between services. Wenn Sie eine Microservices-Architektur verschieben, müssen Sie viele der Bausteine hinzufügen, die in die Microservices-Version der eShopOnContainers-Anwendung implementiert sind: Eventbusbehandlung, Meldungsstabilität und -wiederholungen, Eventual Consistency usw.As you move to a microservices architecture, you need to add many of the building blocks implemented in the microservices version of the eShopOnContainers application: event bus handling, message resiliency and retries, eventual consistency, and more.

Die deutlich einfachere Referenzanwendung eShopOnWeb unterstützt die Verwendung einzelner monolithischer Container.The much simpler eShopOnWeb reference application supports single-container monolithic container usage. Die Anwendung umfasst eine Webanwendung, die herkömmliche MVC-Ansichten, Web-APIs und Razor Pages enthält.The application includes one web application that includes traditional MVC views, web APIs, and Razor Pages. Diese Anwendung kann über den Projektmappenstamm mithilfe der Befehle docker-compose build und docker-compose up gestartet werden.This application can be launched from the solution root using the docker-compose build and docker-compose up commands. Dieser Befehl konfiguriert mithilfe der Dockerfile aus dem Webprojektstamm einen Container für die Webinstanz und führt den Container auf einem angegebenen Port aus.This command configures a container for the web instance, using the Dockerfile found in the web project's root, and runs the container on a specified port. Sie können die Quelle für diese Anwendung von GitHub herunterladen und diese lokal ausführen.You can download the source for this application from GitHub and run it locally. Auch die monolithische Anwendung profitiert von der Bereitstellung in einer Containerumgebung.Even this monolithic application benefits from being deployed in a container environment.

Durch die Containerumgebung wird jede Instanz der Anwendung in derselben Umgebung ausgeführt.For one, the containerized deployment means that every instance of the application runs in the same environment. Dies schließt die Entwicklungsumgebung ein, in der das frühe Testen und die Entwicklung stattfinden.This includes the developer environment where early testing and development take place. Das Entwicklungsteam kann die Anwendung in einer Containerumgebung ausführen, die der Produktionsumgebung entspricht.The development team can run the application in a containerized environment that matches the production environment.

Zusätzlich können Containeranwendungen zu geringeren Kosten skaliert werden.In addition, containerized applications scale out at lower cost. Die Verwendung einer Containerumgebung ermöglicht eine größere Ressourcenfreigabe als herkömmliche VM-Umgebungen.Using a container environment enables greater resource sharing than traditional VM environments.

Schließlich erzwingt das Containerisieren einer Anwendung eine Trennung zwischen der Geschäftslogik und dem Speicherserver.Finally, containerizing the application forces a separation between the business logic and the storage server. Wenn die Anwendung skaliert wird, verwenden alle Container ein einziges physisches Speichermedium.As the application scales out, the multiple containers will all rely on a single physical storage medium. In der Regel ist dieses Speichermedium ein Hochverfügbarkeitsserver, der eine SQL Server-Datenbank ausführt.This storage medium would typically be a high-availability server running a SQL Server database.

Docker-UnterstützungDocker support

Das eShopOnWeb-Projekt wird auf .NET Core ausgeführt.The eShopOnWeb project runs on .NET Core. Darum kann es entweder auf Linux- oder auf Windows-basierten Containern ausgeführt werden.Therefore, it can run in either Linux-based or Windows-based containers. Beachten Sie, dass Sie für die Docker-Bereitstellung den gleichen Hosttyp für SQL Server verwenden sollten.Note that for Docker deployment, you want to use the same host type for SQL Server. Linux-basierte Container haben einen geringeren Speicherbedarf und werden bevorzugt.Linux-based containers allow a smaller footprint and are preferred.

Sie können Visual Studio 2017 (oder höher) verwenden, um einer vorhandenen Anwendung Docker-Unterstützung hinzuzufügen, indem Sie mit der rechten Maustaste auf ein Projekt im Projektmappen-Explorer und dann auf Hinzufügen > Docker-Unterstützung klicken.You can use Visual Studio 2017 or later to add Docker support to an existing application by right-clicking on a project in Solution Explorer and choosing Add > Docker Support. Dadurch werden die erforderlichen Dateien hinzugefügt, und das Projekt wird so geändert, dass es diese verwendet.This adds the files required and modifies the project to use them. Das aktuelle eShopOnWeb-Beispiel enthält diese Dateien bereits.The current eShopOnWeb sample already has these files in place.

Die Datei auf Projektmappenebene docker-compose.yml enthält Informationen darüber, welche Images erstellt und welche Container gestartet werden müssen.The solution-level docker-compose.yml file contains information about what images to build and what containers to launch. Die Datei ermöglicht Ihnen die Verwendung des docker-compose-Befehls zum gleichzeitigen Starten mehrerer Anwendungen.The file allows you to use the docker-compose command to launch multiple applications at the same time. In diesem Fall wird nur das Webprojekt gestartet.In this case, it is only launching the Web project. Sie können sie ebenfalls zum Konfigurieren von Abhängigkeiten verwenden, z.B. für einen separaten Datenbankcontainer.You can also use it to configure dependencies, such as a separate database container.

version: '3'

services:
  eshopwebmvc:
    image: eshopwebmvc
    build:
      context: .
      dockerfile: src/Web/Dockerfile
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    ports:
      - "5106:5106"

networks:
  default:
    external:
      name: nat

Die docker-compose.yml-Datei verweist auf die Dockerfile im Web-Projekt.The docker-compose.yml file references the Dockerfile in the Web project. Die Dockerfile-Datei wird verwendet, um anzugeben, welcher Basiscontainer verwendet und wie die Anwendung darauf konfiguriert wird.The Dockerfile is used to specify which base container will be used and how the application will be configured on it. Die Dockerfile-Datei von Web:The Web' Dockerfile:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /app

COPY *.sln .
COPY . .
WORKDIR /app/src/Web
RUN dotnet restore

RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
WORKDIR /app
COPY --from=build /app/src/Web/out ./

ENTRYPOINT ["dotnet", "Web.dll"]

Problembehandlung bei DockerTroubleshooting Docker problems

Wenn Sie die Containeranwendung ausführen, wird diese ausgeführt, bis Sie sie beenden.Once you run the containerized application, it continues to run until you stop it. Mit dem Befehl docker ps können Sie anzeigen, welche Container ausgeführt werden.You can view which containers are running with the docker ps command. Sie können einen aktiven Container beenden, indem Sie den Befehl docker stop verwenden und die Container-ID angeben.You can stop a running container by using the docker stop command and specifying the container ID.

Beachten Sie, dass ausgeführte Docker-Container an Ports gebunden sein können, die Sie möglicherweise andernfalls in Ihrer Entwicklungsumgebung verwenden.Note that running Docker containers may be bound to ports you might otherwise try to use in your development environment. Wenn Sie versuchen, eine Anwendung mit dem gleichen Port auszuführen oder zu debuggen, den ein aktiver Docker-Container verwendet, erhalten Sie eine Fehlermeldung, die angibt, dass der Server nicht an diesen Port gebunden werden kann.If you try to run or debug an application using the same port as a running Docker container, you'll get an error stating that the server can't bind to that port. Auch hier sollte das Beenden des Containers das Problem beheben.Once again, stopping the container should resolve the issue.

Wenn Sie Ihrer Anwendung mithilfe von Visual Studio Docker-Unterstützung hinzufügen möchten, stellen Sie sicher, dass Docker Desktop ausgeführt wird, während Sie dies tun.If you want to add Docker support to your application using Visual Studio, make sure Docker Desktop is running when you do so. Der Assistent wird nicht ordnungsgemäß ausgeführt, wenn Docker Desktop beim Starten des Assistenten nicht ausgeführt wird.The wizard won't run correctly if Docker Desktop isn't running when you start the wizard. Darüber hinaus überprüft der Assistent Ihre aktuelle Containerwahl, um die richtige Docker-Unterstützung hinzuzufügen.In addition, the wizard examines your current container choice to add the correct Docker support. Wenn Sie Unterstützung für Windows-Container hinzufügen möchten, führen Sie den Assistenten aus, während Docker Desktop mit der Konfiguration für Windows-Container ausgeführt wird.If you want to add support for Windows Containers, you need to run the wizard while you have Docker Desktop running with Windows Containers configured. Wenn Sie Unterstützung für Linux-Container hinzufügen möchten, führen Sie den Assistenten aus, während Docker mit der Konfiguration für Linux-Container ausgeführt wird.If you want to add support for Linux containers, run the wizard while you have Docker running with Linux containers configured.

Ressourcen: Häufig verwendete WebarchitekturenReferences – Common web architectures