Typowe architektury aplikacji internetowychCommon web application architectures

"Jeśli sądzisz, że dobra architektura jest kosztowna, wypróbuj złą architekturę"."If you think good architecture is expensive, try bad architecture."
-Brian i Joseph Yoder- Brian Foote and Joseph Yoder

Większość tradycyjnych aplikacji .NET jest wdrażana jako pojedyncze jednostki odpowiadające plikowi wykonywalnemu lub pojedynczej aplikacji sieci Web uruchomionej w ramach jednej domeny AppDomain usług IIS.Most traditional .NET applications are deployed as single units corresponding to an executable or a single web application running within a single IIS appdomain. Jest to najprostszy model wdrażania i jest bardzo dobrze obsługujący wiele wewnętrznych i mniejszych aplikacji publicznych.This is the simplest deployment model and serves many internal and smaller public applications very well. Jednak nawet w przypadku tej pojedynczej jednostki wdrożenia większość aplikacji nieuproszczonych korzysta z niektórych logicznych rozbarwień na kilku warstwach.However, even given this single unit of deployment, most non-trivial business applications benefit from some logical separation into several layers.

Co to jest aplikacja monolityczna?What is a monolithic application?

Aplikacja monolityczna to ta, która jest całkowicie niezależna, w warunkach jego działania.A monolithic application is one that is entirely self-contained, in terms of its behavior. Może ona współdziałać z innymi usługami lub magazynami danych w trakcie wykonywania operacji, ale jego rdzeń jest uruchamiany w ramach własnego procesu, a cała aplikacja jest zwykle wdrażana jako pojedyncza jednostka.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. Jeśli taka aplikacja musi skalować w poziomie, zazwyczaj cała aplikacja jest duplikowana na wielu serwerach lub maszynach wirtualnych.If such an application needs to scale horizontally, typically the entire application is duplicated across multiple servers or virtual machines.

Wszystkie aplikacje w jednym miejscuAll-in-one applications

Najmniejsza możliwa liczba projektów dla architektury aplikacji to jedna z nich.The smallest possible number of projects for an application architecture is one. W tej architekturze Cała logika aplikacji jest zawarta w pojedynczym projekcie, skompilowana do jednego zestawu i wdrożona jako pojedyncza jednostka.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.

Nowy projekt ASP.NET Core, niezależnie od tego, czy został utworzony w programie Visual Studio, czy z wiersza polecenia, jest uruchamiany jako proste monolitu "All-in-one".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. Zawiera wszystkie zachowania aplikacji, w tym logiki dostępu do prezentacji, biznesowego i danych.It contains all of the behavior of the application, including presentation, business, and data access logic. Rysunek 5-1 przedstawia strukturę plików aplikacji pojedynczego projektu.Figure 5-1 shows the file structure of a single-project app.

Aplikacja ASP.NET Core pojedynczego projektu

Rysunek 5-1.Figure 5-1. Pojedynczy projekt ASP.NET Core aplikacji.A single project ASP.NET Core app.

W scenariuszu pojedynczego projektu rozdzielenie problemów odbywa się za pomocą folderów.In a single project scenario, separation of concerns is achieved through the use of folders. Szablon domyślny zawiera oddzielne foldery dla obowiązków wzorca MVC dla modeli, widoków i kontrolerów, a także dodatkowe foldery dla danych i usług.The default template includes separate folders for MVC pattern responsibilities of Models, Views, and Controllers, as well as additional folders for Data and Services. W tym rozmieszczeniu szczegóły prezentacji powinny być ograniczone możliwie jak najwięcej do folderu widoki, a szczegóły implementacji dostępu do danych powinny być ograniczone do klas przechowywanych w folderze danych.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. Logika biznesowa powinna znajdować się w usługach i klasach w folderze modele.Business logic should reside in services and classes within the Models folder.

Chociaż proste, jednoprojektowe rozwiązanie monolityczne ma pewne wady.Although simple, the single-project monolithic solution has some disadvantages. Wraz ze wzrostem rozmiaru i złożoności projektu liczba plików i folderów nadal rośnie.As the project's size and complexity grows, the number of files and folders will continue to grow as well. Problemy związane z interfejsem użytkownika (modele, widoki, kontrolery) znajdują się w wielu folderach, które nie są pogrupowane w kolejności alfabetycznej.User interface (UI) concerns (models, views, controllers) reside in multiple folders, which aren't grouped together alphabetically. Ten problem występuje tylko wtedy, gdy dodatkowe konstrukcje poziomu interfejsu użytkownika, takie jak filters lub ModelBinders, są dodawane do własnych folderów.This issue only gets worse when additional UI-level constructs, such as Filters or ModelBinders, are added in their own folders. Logika biznesowa jest rozproszeni między modelami i folderami usług i nie istnieje jasne wskazanie klas, w których foldery powinny być zależne od innych.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. Brak organizacji na poziomie projektu często prowadzi do kodu spaghetti.This lack of organization at the project level frequently leads to spaghetti code.

Aby rozwiązać te problemy, aplikacje często są rozłożone na rozwiązania obejmujące wiele projektów, w których każdy projekt jest traktowany jako znajdujący się w określonej warstwie aplikacji.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.

Co to są warstwy logiczne?What are layers?

W miarę wzrostu złożoności aplikacji jeden ze sposobów zarządzania tą złożonością polega na rozdzieleniu aplikacji zależnie od jej obowiązków lub obaw.As applications grow in complexity, one way to manage that complexity is to break up the application according to its responsibilities or concerns. Jest to zgodne z zasadami separacji i mogą pomóc w utrzymaniu zorganizowanej bazy kodu, dzięki czemu deweloperzy mogą łatwo znaleźć, gdzie są zaimplementowane pewne funkcje.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. Architektura warstwowa oferuje wiele korzyści poza organizacją kodu, chociaż.Layered architecture offers a number of advantages beyond just code organization, though.

Organizując kod na warstwy, typowe funkcje niskiego poziomu mogą być ponownie używane w całej aplikacji.By organizing code into layers, common low-level functionality can be reused throughout the application. To ponowne użycie jest korzystne, ponieważ oznacza to, że nie trzeba pisać kodu i ponieważ może on umożliwić standaryzację aplikacji w ramach jednej implementacji, zgodnie z zasadą nie powtarzaj siebie (sucha) .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.

W przypadku architektury warstwowej aplikacje mogą wymuszać ograniczenia dotyczące tego, które warstwy mogą komunikować się z innymi warstwami.With a layered architecture, applications can enforce restrictions on which layers can communicate with other layers. Pomaga to w osiągnięciu hermetyzacji.This helps to achieve encapsulation. Po zmianie lub wymianie warstwy należy mieć wpływ tylko na te warstwy, które z nią pracują.When a layer is changed or replaced, only those layers that work with it should be impacted. Ograniczając warstwy, które są zależne od tego, które warstwy, wpływ zmian można zmniejszyć, tak aby jedna zmiana nie miała wpływu na całą aplikację.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.

Warstwy (i hermetyzacja) znacznie ułatwiają zamianę funkcji w aplikacji.Layers (and encapsulation) make it much easier to replace functionality within the application. Na przykład aplikacja może początkowo używać własnej SQL Server bazy danych do trwałości, ale później może zdecydować się na korzystanie z strategii trwałości opartej na chmurze lub jednej za interfejsem API sieci Web.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. Jeśli aplikacja prawidłowo hermetyzuje swoją implementację trwałości w obrębie warstwy logicznej, SQL Server konkretna warstwa może zostać zastąpiona przez nową, implementując ten sam interfejs publiczny.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.

Oprócz możliwości zamiany implementacji w odpowiedzi na przyszłe zmiany w wymaganiach, warstwy aplikacji mogą także ułatwić wymianę implementacji na potrzeby testowania.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. Zamiast konieczności pisania testów, które działają względem warstwy danych rzeczywistych lub warstwy interfejsu użytkownika aplikacji, te warstwy mogą zostać zastąpione w czasie testu przy użyciu fałszywych implementacji, które zapewniają znane odpowiedzi na żądania.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. Zwykle sprawia to, że testy znacznie ułatwiają pisanie i szybsze wykonywanie w porównaniu z uruchamianiem testów względem rzeczywistej infrastruktury aplikacji.This typically makes tests much easier to write and much faster to run when compared to running tests against the application's real infrastructure.

Warstwami logicznymi jest typowa technika ulepszania organizacji kodu w aplikacjach oprogramowania dla przedsiębiorstw. istnieje kilka sposobów, w których kod może być zorganizowany do warstw.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.

Uwaga

Warstwy reprezentują logiczne separacje w aplikacji.Layers represent logical separation within the application. W przypadku, gdy logika aplikacji jest fizycznie dystrybuowana do oddzielnych serwerów lub procesów, te oddzielne elementy docelowe wdrożenia są określane jako warstwy.In the event that application logic is physically distributed to separate servers or processes, these separate physical deployment targets are referred to as tiers. Jest to możliwe, i dość często, aby mieć aplikację N-warstwową, która jest wdrażana w jednej warstwie.It's possible, and quite common, to have an N-Layer application that is deployed to a single tier.

Tradycyjne aplikacje architektury "N-Layer"Traditional "N-Layer" architecture applications

Najbardziej powszechną organizacją logiki aplikacji do warstw przedstawiono na rysunku 5-2.The most common organization of application logic into layers is shown in Figure 5-2.

Typowe warstwy aplikacji

Rysunek 5-2.Figure 5-2. Typowe warstwy aplikacji.Typical application layers.

Te warstwy są często skracane jako interfejs użytkownika, LOGIKI biznesowej (warstwa logiki biznesowej) i DAL (warstwa dostępu do danych).These layers are frequently abbreviated as UI, BLL (Business Logic Layer), and DAL (Data Access Layer). Korzystając z tej architektury, użytkownicy wysyłają żądania za pośrednictwem warstwy interfejsu użytkownika, które współdziałają tylko z LOGIKI biznesowej.Using this architecture, users make requests through the UI layer, which interacts only with the BLL. LOGIKI biznesowej z kolei może wywoływać DAL dla żądań dostępu do danych.The BLL, in turn, can call the DAL for data access requests. Warstwa interfejsu użytkownika nie powinna bezpośrednio wykonywać żadnych żądań do DAL, ani nie powinna być współpracująca z trwałością bezpośrednio za pośrednictwem innych metod.The UI layer shouldn't make any requests to the DAL directly, nor should it interact with persistence directly through other means. Podobnie LOGIKI biznesowej powinna współistnieć z trwałością, przechodząc przez DAL.Likewise, the BLL should only interact with persistence by going through the DAL. W ten sposób każda warstwa ma własną dobrze znaną odpowiedzialność.In this way, each layer has its own well-known responsibility.

Jedną z wadą tego tradycyjnego podejścia do warstw jest to, że zależności czasu kompilacji są uruchamiane od góry do dołu.One disadvantage of this traditional layering approach is that compile-time dependencies run from the top to the bottom. Oznacza to, że warstwa interfejsu użytkownika zależy od LOGIKI biznesowej, która zależy od DAL.That is, the UI layer depends on the BLL, which depends on the DAL. Oznacza to, że LOGIKI biznesowej, który zwykle zawiera najważniejsze logiki w aplikacji, zależy od szczegółów implementacji dostępu do danych (i często w przypadku istnienia bazy danych).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). Testowanie logiki biznesowej w takiej architekturze jest często trudne i wymaga testowej bazy danych.Testing business logic in such an architecture is often difficult, requiring a test database. Zasady Inversion dotyczącej zależności mogą służyć do rozwiązywania tego problemu, jak widać w następnej sekcji.The dependency inversion principle can be used to address this issue, as you'll see in the next section.

Na rysunku 5-3 przedstawiono przykładowe rozwiązanie, które dzieli aplikację na trzy projekty według odpowiedzialności (lub warstwy).Figure 5-3 shows an example solution, breaking the application into three projects by responsibility (or layer).

Prosta aplikacja monolityczna z trzema projektami

Rysunek 5-3.Figure 5-3. Prosta aplikacja monolityczna z trzema projektami.A simple monolithic application with three projects.

Mimo że ta aplikacja korzysta z kilku projektów do celów organizacyjnych, nadal jest wdrażana jako jedna jednostka, a jej klienci będą korzystać z niej jako pojedynczej aplikacji sieci Web.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. Pozwala to na bardzo prosty proces wdrażania.This allows for very simple deployment process. Rysunek 5-4 pokazuje, jak taka aplikacja może być hostowana przy użyciu platformy Azure.Figure 5-4 shows how such an app might be hosted using Azure.

Proste wdrażanie aplikacji sieci Web platformy Azure

Rysunek 5-4.Figure 5-4. Proste wdrażanie aplikacji sieci Web platformy AzureSimple deployment of Azure Web App

W miarę wzrostu potrzeb aplikacji mogą być wymagane bardziej złożone i niezawodne rozwiązania wdrożeniowe.As application needs grow, more complex and robust deployment solutions may be required. Rysunek 5-5 przedstawia przykład bardziej złożonego planu wdrożenia, który obsługuje dodatkowe możliwości.Figure 5-5 shows an example of a more complex deployment plan that supports additional capabilities.

Wdrażanie aplikacji sieci Web w Azure App Service

Rysunek 5-5.Figure 5-5. Wdrażanie aplikacji sieci Web w Azure App ServiceDeploying a web app to an Azure App Service

Wewnętrznie organizacja tego projektu w wielu projektach na podstawie odpowiedzialności usprawnia łatwość utrzymania aplikacji.Internally, this project's organization into multiple projects based on responsibility improves the maintainability of the application.

Tę jednostkę można skalować w górę lub w dół, aby korzystać z skalowalności na żądanie funkcji opartych na chmurze.This unit can be scaled up or out to take advantage of cloud-based on-demand scalability. Skalowanie w górę oznacza dodanie dodatkowego procesora CPU, pamięci, miejsca na dysku lub innych zasobów do serwerów obsługujących aplikację.Scaling up means adding additional CPU, memory, disk space, or other resources to the server(s) hosting your app. Skalowanie w dół oznacza dodanie dodatkowych wystąpień takich serwerów, niezależnie od tego, czy są to serwery fizyczne, maszyny wirtualne czy kontenery.Scaling out means adding additional instances of such servers, whether these are physical servers, virtual machines, or containers. Gdy aplikacja jest hostowana w wielu wystąpieniach, moduł równoważenia obciążenia jest używany do przypisywania żądań do poszczególnych wystąpień aplikacji.When your app is hosted across multiple instances, a load balancer is used to assign requests to individual app instances.

Najprostszym podejściem do skalowania aplikacji sieci Web na platformie Azure jest ręczne skonfigurowanie skalowania w planie App Service aplikacji.The simplest approach to scaling a web application in Azure is to configure scaling manually in the application's App Service Plan. Rysunek 5-6 przedstawia odpowiedni ekran pulpitu nawigacyjnego platformy Azure, aby skonfigurować liczbę wystąpień obsługujących aplikację.Figure 5-6 shows the appropriate Azure dashboard screen to configure how many instances are serving an app.

Skalowanie planu App Service na platformie Azure

Rysunek 5-6.Figure 5-6. Skalowanie planu App Service na platformie Azure.App Service Plan scaling in Azure.

Czysta architekturaClean architecture

Aplikacje, które są zgodne z zasadą niezależności zależności, a także zasady projektowania Domain-Driven (DDD), które mają zostać przydzielone do podobnej architektury.Applications that follow the Dependency Inversion Principle as well as the Domain-Driven Design (DDD) principles tend to arrive at a similar architecture. Ta architektura została przełączona przez wiele nazw w latach.This architecture has gone by many names over the years. Jedna z pierwszych nazw była architekturą sześciokątną, a po niej porty i karty.One of the first names was Hexagonal Architecture, followed by Ports-and-Adapters. Niedawno jest to zacytowane jako Architektura cebuli lub czysta architektura.More recently, it's been cited as the Onion Architecture or Clean Architecture. Ta druga nazwa, czysta architektura, jest używana jako nazwa tej architektury w tej książce elektronicznej.The latter name, Clean Architecture, is used as the name for this architecture in this e-book.

Aplikacja referencyjna eShopOnWeb korzysta z metody czystego architektury w organizowaniu kodu do projektów.The eShopOnWeb reference application uses the Clean Architecture approach in organizing its code into projects. Możesz znaleźć szablon rozwiązania, którego można użyć jako punktu wyjścia dla własnego ASP.NET Core w repozytorium GitHub 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.

Czysty architektura powoduje umieszczenie logiki biznesowej i modelu aplikacji w centrum aplikacji.Clean architecture puts the business logic and application model at the center of the application. Zamiast mieć logikę biznesową zależą od dostępu do danych lub innych problemów związanych z infrastrukturą, ta zależność jest odwrócona: szczegóły infrastruktury i implementacji zależą od rdzenia aplikacji.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. Jest to osiągane przez zdefiniowanie abstrakcji lub interfejsów w rdzeń aplikacji, które następnie są implementowane przez typy zdefiniowane w warstwie infrastruktury.This is achieved by defining abstractions, or interfaces, in the Application Core, which are then implemented by types defined in the Infrastructure layer. Typowym sposobem wizualizacji tej architektury jest użycie serii okręgów koncentrycznych, podobnie jak w przypadku cebuli.A common way of visualizing this architecture is to use a series of concentric circles, similar to an onion. Rysunek 5-7 pokazuje przykład tego stylu reprezentacji architektury.Figure 5-7 shows an example of this style of architectural representation.

Czysta architektura; Widok cebuli

Rysunek 5-7.Figure 5-7. Czysta architektura; Widok cebuliClean Architecture; onion view

Na tym diagramie zależności przepływu w kierunku najbardziej wewnętrznego okręgu.In this diagram, dependencies flow toward the innermost circle. Rdzeń aplikacji przyjmuje swoją nazwę z pozycji na początku tego diagramu.The Application Core takes its name from its position at the core of this diagram. Na diagramie można zobaczyć, że rdzeń aplikacji nie ma żadnych zależności od innych warstw aplikacji.And you can see on the diagram that the Application Core has no dependencies on other application layers. Jednostki i interfejsy aplikacji są w bardzo wyśrodkowane.The application's entities and interfaces are at the very center. Po prostu poza, ale nadal w rdzeń aplikacji, są usługi domenowe, które zwykle implementują interfejsy zdefiniowane w okręgu wewnętrznym.Just outside, but still in the Application Core, are domain services, which typically implement interfaces defined in the inner circle. Poza rdzeniem aplikacji zarówno interfejs użytkownika, jak i warstwy infrastruktury zależą od rdzenia aplikacji, ale nie na siebie (koniecznie).Outside of the Application Core, both the UI and the Infrastructure layers depend on the Application Core, but not on one another (necessarily).

Rysunek 5-8 pokazuje bardziej tradycyjny poziomy diagram warstwowy, który lepiej odzwierciedla zależność między interfejsem użytkownika a innymi warstwami.Figure 5-8 shows a more traditional horizontal layer diagram that better reflects the dependency between the UI and other layers.

Czysta architektura; Widok warstwy poziomej

Rysunek 5-8.Figure 5-8. Czysta architektura; Widok warstwy poziomejClean Architecture; horizontal layer view

Należy zauważyć, że pełne strzałki reprezentują zależności czasu kompilacji, natomiast strzałka kreskowana reprezentuje zależność tylko do wykonania.Note that the solid arrows represent compile-time dependencies, while the dashed arrow represents a runtime-only dependency. W przypadku czystej architektury warstwa interfejsu użytkownika współpracuje z interfejsami zdefiniowanymi w rdzeń aplikacji w czasie kompilacji i najlepiej nie należy wiedzieć o typach implementacji zdefiniowanych w warstwie infrastruktury.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. Jednak w czasie wykonywania, te typy implementacji są wymagane do wykonania aplikacji, dlatego muszą być obecne i rozłączone do interfejsów podstawowych aplikacji za pomocą iniekcji zależności.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.

Na rysunku 5-9 przedstawiono bardziej szczegółowy widok architektury aplikacji ASP.NET Core po skompilowaniu tych zaleceń.Figure 5-9 shows a more detailed view of an ASP.NET Core application's architecture when built following these recommendations.

ASP.NET Core diagram architektury po czystej architekturze

Rysunek 5-9.Figure 5-9. ASP.NET Core diagram architektury po czystej architekturze.ASP.NET Core architecture diagram following Clean Architecture.

Ponieważ podstawowe aplikacje nie zależą od infrastruktury, bardzo proste jest zapisanie zautomatyzowanych testów jednostkowych dla tej warstwy.Because the Application Core doesn't depend on Infrastructure, it's very easy to write automated unit tests for this layer. Ilustracje 5-10 i 5-11 pokazują, jak testy mieszczą się w tej architekturze.Figures 5-10 and 5-11 show how tests fit into this architecture.

UnitTestCore

Rysunek 5-10.Figure 5-10. Podstawowe testy jednostkowe aplikacji w izolacji.Unit testing Application Core in isolation.

IntegrationTests

Rysunek 5-11.Figure 5-11. Integracja polega na testowaniu implementacji infrastruktury z zależnościami zewnętrznymi.Integration testing Infrastructure implementations with external dependencies.

Ze względu na to, że warstwa interfejsu użytkownika nie ma żadnej bezpośredniej zależności od typów zdefiniowanych w projekcie infrastruktury, można bardzo łatwo zamienić implementacje, aby ułatwić testowanie lub reagowanie na zmieniające się wymagania aplikacji.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. Wbudowana w ASP.NET Core funkcja i obsługa iniekcji zależności sprawia, że ta architektura jest najlepszym sposobem na strukturę nieuproszczonych aplikacji.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.

W przypadku aplikacji monolitycznych wszystkie projekty aplikacji, infrastruktury i interfejsu użytkownika są uruchamiane jako pojedyncze aplikacje.For monolithic applications the Application Core, Infrastructure, and UI projects are all run as a single application. Architektura aplikacji środowiska uruchomieniowego może wyglądać podobnie do ilustracji 5-12.The runtime application architecture might look something like Figure 5-12.

Architektura ASP.NET Core 2

Rysunek 5-12.Figure 5-12. Przykładowa architektura środowiska uruchomieniowego aplikacji ASP.NET Core.A sample ASP.NET Core app's runtime architecture.

Organizowanie kodu w czystej architekturzeOrganizing code in Clean Architecture

W rozwiązaniu czystego architektury każdy projekt ma wyraźne obowiązki.In a Clean Architecture solution, each project has clear responsibilities. W związku z tym niektóre typy należą do każdego projektu i często znajdują się foldery odpowiadające tym typom w odpowiednim projekcie.As such, certain types belong in each project and you'll frequently find folders corresponding to these types in the appropriate project.

Rdzeń aplikacjiApplication Core

Rdzeń aplikacji zawiera model biznesowy, który obejmuje jednostki, usługi i interfejsy.The Application Core holds the business model, which includes entities, services, and interfaces. Te interfejsy obejmują abstrakcje operacji, które będą wykonywane przy użyciu infrastruktury, takiej jak dostęp do danych, dostęp do systemu plików, wywołania sieciowe itp. Czasami usługi lub interfejsy zdefiniowane w tej warstwie muszą współdziałać z typami nienależącymi do jednostki, które nie są zależne od interfejsu użytkownika ani infrastruktury.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. Można je definiować jako proste Transfer danych obiekty (DTO).These can be defined as simple Data Transfer Objects (DTOs).

Typy podstawowe aplikacjiApplication Core types
  • Jednostki (utrwalone klasy modelu biznesowego)Entities (business model classes that are persisted)
  • InterfejsyInterfaces
  • UsługiServices
  • DTODTOs

InfrastrukturaInfrastructure

Projekt infrastruktury zazwyczaj obejmuje implementacje dostępu do danych.The Infrastructure project typically includes data access implementations. W typowej aplikacji sieci Web ASP.NET Core te implementacje obejmują Entity Framework (EF) DbContext, wszystkie EF Core Migration obiekty, które zostały zdefiniowane, oraz klasy implementacji dostępu do danych.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. Najbardziej typowym sposobem na abstrakcyjny kod implementacji dostępu do danych jest użycie wzorca projektowego repozytorium.The most common way to abstract data access implementation code is through the use of the Repository design pattern.

Oprócz implementacji dostępu do danych, projekt infrastruktury powinien zawierać implementacje usług, które muszą wchodzić w skład z obaw związanych z infrastrukturą.In addition to data access implementations, the Infrastructure project should contain implementations of services that must interact with infrastructure concerns. Te usługi powinny implementować interfejsy zdefiniowane w rdzeniu aplikacji, a więc infrastruktura powinna mieć odwołanie do projektu podstawowego aplikacji.These services should implement interfaces defined in the Application Core, and so Infrastructure should have a reference to the Application Core project.

Typy infrastrukturyInfrastructure types
  • Typy EF Core ( DbContext , Migration )EF Core types (DbContext, Migration)
  • Typy implementacji dostępu do danych (repozytoria)Data access implementation types (Repositories)
  • Usługi specyficzne dla infrastruktury (na przykład FileLogger lub SmtpNotifier )Infrastructure-specific services (for example, FileLogger or SmtpNotifier)

Warstwa interfejsu użytkownikaUI Layer

Warstwa interfejsu użytkownika w aplikacji ASP.NET Core MVC jest punktem wejścia dla aplikacji.The user interface layer in an ASP.NET Core MVC application is the entry point for the application. Ten projekt powinien odwoływać się do projektu podstawowego aplikacji, a jego typy powinny współdziałać z infrastrukturą przez interfejsy zdefiniowane w podstawowym aplikacji.This project should reference the Application Core project, and its types should interact with infrastructure strictly through interfaces defined in Application Core. W warstwie interfejsu użytkownika nie powinny być dozwolone żadne bezpośrednie wystąpienia ani statyczne wywołania do typów warstw infrastruktury.No direct instantiation of or static calls to the Infrastructure layer types should be allowed in the UI layer.

Typy warstw interfejsu użytkownikaUI Layer types
  • KontroleryControllers
  • FiltryFilters
  • WidokiViews
  • Modele widokówViewModels
  • UruchamianieStartup

Klasa startowa jest odpowiedzialna za skonfigurowanie aplikacji oraz w celu zapewnienia obsługi typów implementacji w interfejsach, co pozwala na prawidłowe działanie iniekcji zależności w czasie wykonywania.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.

Uwaga

Aby można było połączyć iniekcję zależności w ConfigureServices w pliku Startup.cs projektu interfejsu użytkownika, projekt może wymagać odniesienia do projektu infrastruktury.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. Tę zależność można wyeliminować, najłatwiej przy użyciu niestandardowego kontenera DI.This dependency can be eliminated, most easily by using a custom DI container. Na potrzeby tego przykładu najprostszym podejściem jest umożliwienie projektowi interfejsu użytkownika odwoływania się do projektu infrastruktury.For the purposes of this sample, the simplest approach is to allow the UI project to reference the Infrastructure project.

Monolityczne aplikacje i konteneryMonolithic applications and containers

Można utworzyć pojedynczą i monolityczną aplikację sieci Web lub usługę opartą na wdrożeniu, a następnie wdrożyć ją jako kontener.You can build a single and monolithic-deployment based Web Application or Service and deploy it as a container. W aplikacji może nie być lity, ale zorganizowany w kilka bibliotek, składników ani warstw.Within the application, it might not be monolithic but organized into several libraries, components, or layers. Zewnętrznie jest to pojedynczy kontener, taki jak pojedynczy proces, pojedyncza aplikacja internetowa lub jedna usługa.Externally, it's a single container like a single process, single web application, or single service.

Aby zarządzać tym modelem, należy wdrożyć pojedynczy kontener do reprezentowania aplikacji.To manage this model, you deploy a single container to represent the application. Aby skalować, po prostu Dodaj dodatkowe kopie przy użyciu modułu równoważenia obciążenia.To scale, just add additional copies with a load balancer in front. Prostota pochodzi z zarządzania pojedynczym wdrożeniem w jednym kontenerze lub maszynie wirtualnej.The simplicity comes from managing a single deployment in a single container or VM.

Rysunek 5-13

W każdym kontenerze można uwzględnić wiele składników/bibliotek lub warstwy wewnętrzne, jak pokazano na rysunku 5-13.You can include multiple components/libraries or internal layers within each container, as illustrated in Figure 5-13. Jednak zgodnie z zasadą kontenera "kontener wykonuje jedną czynność i robi to w jednym procesie", wzorzec monolityczny może stanowić konflikt.But, following the container principle of "a container does one thing, and does it in one process", the monolithic pattern might be a conflict.

Minusem tego podejścia ma miejsce, gdy aplikacja zostanie powiększona, co wymaga jego skalowania.The downside of this approach comes if/when the application grows, requiring it to scale. Jeśli cała aplikacja jest skalowana, problem nie występuje.If the entire application scales, it's not really a problem. Jednak w większości przypadków kilka części aplikacji to punkty podlewki wymagające skalowania, a inne składniki są mniej.However, in most cases, a few parts of the application are the choke points requiring scaling, while other components are used less.

Przy użyciu typowego przykładu handlu elektronicznego, co jest potrzebne do skalowania, to składnik informacji o produkcie.Using the typical eCommerce example, what you likely need to scale is the product information component. Wielu więcej klientów przegląda produkty od ich zakupu.Many more customers browse products than purchase them. Więcej klientów korzysta z koszyka niż w przypadku korzystania z potoku płatności.More customers use their basket than use the payment pipeline. Mniejsza liczba klientów umożliwia dodanie komentarzy lub wyświetlenie ich historii zakupów.Fewer customers add comments or view their purchase history. Najkorzystniej masz kilku pracowników w jednym regionie, który musi zarządzać kampanią zawartości i kampanii marketingowej.And you likely only have a handful of employees, in a single region, that need to manage the content and marketing campaigns. Poprzez skalowanie projektu monolitycznego cały kod jest wdrażany wiele razy.By scaling the monolithic design, all the code is deployed multiple times.

Oprócz problemu "Skaluj wszystko" zmiany w pojedynczym składniku wymagają pełnego przetestowania całej aplikacji oraz całkowitego ponownego wdrożenia wszystkich wystąpień.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.

Podejście monolityczne jest wspólne, a wiele organizacji opracowuje w ramach tego podejścia do architektury.The monolithic approach is common, and many organizations are developing with this architectural approach. Wiele z nich ma wystarczającą ilość wyników, a inne to limity.Many are having good enough results, while others are hitting limits. Wiele zaprojektowanych aplikacji w tym modelu, ponieważ narzędzia i infrastruktura były zbyt trudne do budowania architektury zorientowanej na usługi (SOA) i nie widzą potrzeb, dopóki aplikacja nie przezwiększyła się.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. Jeśli okaże się, że zbliżasz się do ograniczeń podejścia monolitycznego, Podziel aplikację, aby umożliwić jej lepsze wykorzystanie kontenerów i mikrousług.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.

Rysunek 5-14

Wdrażanie aplikacji monolitycznych w Microsoft Azure można osiągnąć przy użyciu dedykowanych maszyn wirtualnych dla każdego wystąpienia.Deploying monolithic applications in Microsoft Azure can be achieved using dedicated VMs for each instance. Za pomocą usługi Azure Virtual Machine Scale Setsmożna łatwo skalować maszyny wirtualne.Using Azure Virtual Machine Scale Sets, you can easily scale the VMs. Usługa Azure App Services może uruchamiać aplikacje monolityczne i łatwo skalować wystąpienia bez potrzeby zarządzania maszynami wirtualnymi.Azure App Services can run monolithic applications and easily scale instances without having to manage the VMs. Usługa Azure App Services może również uruchamiać pojedyncze wystąpienia kontenerów platformy Docker, upraszczając wdrażanie.Azure App Services can run single instances of Docker containers as well, simplifying the deployment. Przy użyciu platformy Docker można wdrożyć pojedynczą maszynę wirtualną jako hosta platformy Docker i uruchamiać wiele wystąpień.Using Docker, you can deploy a single VM as a Docker host, and run multiple instances. Korzystając z modułu równoważenia obciążenia platformy Azure, jak pokazano na rysunku 5-14, można zarządzać skalowaniem.Using the Azure balancer, as shown in the Figure 5-14, you can manage scaling.

Wdrożenie na różnych hostach może być zarządzane przy użyciu tradycyjnych technik wdrażania.The deployment to the various hosts can be managed with traditional deployment techniques. Hosty platformy Docker mogą być zarządzane za pomocą poleceń, takich jak uruchomienie platformy Docker , wykonywane ręcznie lub za pomocą automatyzacji, takich jak potoki ciągłego dostarczania (CD).The Docker hosts can be managed with commands like docker run performed manually, or through automation such as Continuous Delivery (CD) pipelines.

Aplikacja monolityczna wdrożona jako kontenerMonolithic application deployed as a container

Istnieją zalety używania kontenerów do zarządzania wdrożeniami aplikacji monolitycznych.There are benefits of using containers to manage monolithic application deployments. Skalowanie wystąpień kontenerów jest znacznie szybsze i łatwiejsze niż wdrażanie dodatkowych maszyn wirtualnych.Scaling the instances of containers is far faster and easier than deploying additional VMs. Nawet w przypadku używania zestawów skalowania maszyn wirtualnych do skalowania maszyn wirtualnych trwają one czas.Even when using virtual machine scale sets to scale VMs, they take time to instance. W przypadku wdrożenia jako wystąpienia aplikacji Konfiguracja aplikacji jest zarządzana w ramach maszyny wirtualnej.When deployed as app instances, the configuration of the app is managed as part of the VM.

Wdrażanie aktualizacji jako obrazów platformy Docker odbywa się znacznie szybciej i wydajniej.Deploying updates as Docker images is far faster and network efficient. Obrazy platformy Docker zwykle zaczynają się w ciągu sekund, co przyspiesza wprowadzanie.Docker Images typically start in seconds, speeding rollouts. Przerywanie wystąpienia platformy Docker jest tak proste jak wydawanie docker stop polecenia, zwykle kończącego się w mniej niż drugim.Tearing down a Docker instance is as easy as issuing a docker stop command, typically completing in less than a second.

Ponieważ kontenery są z natury niezmienne przez zaprojektowanie, nigdy nie trzeba martwić się o uszkodzone maszyny wirtualne, natomiast skrypty aktualizacji mogą ulec zapomnieć na potrzeby konkretnej konfiguracji lub pliku pozostawionego na dysku.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.

Kontenerów platformy Docker można używać do monolitycznego wdrażania prostszych aplikacji sieci Web.You can use Docker containers for monolithic deployment of simpler web applications. Pozwala to zwiększyć ciągłą integrację i ciągłe wdrażanie potoków oraz zapewnić pomyślne wdrożenie do produkcji.This improves continuous integration and continuous deployment pipelines and helps achieve deployment-to-production success. Nie ma więcej "działa na mojej maszynie, dlaczego nie działa w środowisku produkcyjnym?"No more “It works on my machine, why does it not work in production?”

Architektura oparta na mikrousługach ma wiele korzyści, ale te korzyści mają na celu zwiększenie złożoności.A microservices-based architecture has many benefits, but those benefits come at a cost of increased complexity. W niektórych przypadkach koszty te zwiększają korzyści, więc jest to lepsza aplikacja do wdrożenia działająca w jednym kontenerze lub w zaledwie kilku kontenerach.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.

Aplikacja monolityczna może nie być łatwo można jej przetworzyć w dobrze rozdzielonych mikrousługach.A monolithic application might not be easily decomposable into well-separated microservices. Mikrousługi powinny działać niezależnie od siebie, aby zapewnić bardziej odporną aplikację.Microservices should work independently of each other to provide a more resilient application. Jeśli nie można dostarczyć niezależnych wycinków funkcji aplikacji, oddzielenie go tylko zwiększa złożoność.If you can't deliver independent feature slices of the application, separating it only adds complexity.

Aplikacja może jeszcze nie mieć możliwości skalowania funkcji niezależnie.An application might not yet need to scale features independently. Wiele aplikacji, gdy wymagają skalowania poza pojedynczym wystąpieniem, może to zrobić za pomocą stosunkowo prostego procesu klonowania całego wystąpienia.Many applications, when they need to scale beyond a single instance, can do so through the relatively simple process of cloning that entire instance. Dodatkowa część pracy w celu rozdzielenia aplikacji na osobne usługi zapewnia minimalną korzyść, gdy skalowanie pełnych wystąpień aplikacji jest proste i ekonomiczne.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.

Na wczesnym etapie opracowywania aplikacji może nie mieć jasnego pomysłu, w którym naturalne granice funkcjonalności są.Early in the development of an application, you might not have a clear idea where the natural functional boundaries are. Podczas opracowywania minimalnego produktu, którego oddzielenie prawdopodobnie nie zostało jeszcze wykonane.As you develop a minimum viable product, the natural separation might not yet have emerged. Niektóre z tych warunków mogą być tymczasowe.Some of these conditions might be temporary. Można zacząć od utworzenia aplikacji monolitycznej i późniejszego oddzielenia niektórych funkcji, które mają być opracowane i wdrożone jako mikrousługi.You might start by creating a monolithic application, and later separate some features to be developed and deployed as microservices. Inne warunki mogą być niezbędne w przypadku problemów z aplikacją, co oznacza, że aplikacja może nigdy nie być uszkodzona w wielu mikrousługach.Other conditions might be essential to the application's problem space, meaning that the application might never be broken into multiple microservices.

Rozdzielenie aplikacji na wiele procesów dyskretnych powoduje również zwiększenie nakładu pracy.Separating an application into many discrete processes also introduces overhead. Istnieje większa złożoność oddzielająca funkcje do różnych procesów.There's more complexity in separating features into different processes. Protokoły komunikacyjne stają się bardziej skomplikowane.The communication protocols become more complex. Zamiast wywołań metod, należy używać komunikacji asynchronicznej między usługami.Instead of method calls, you must use asynchronous communications between services. Podczas przechodzenia do architektury mikrousług należy dodać wiele bloków konstrukcyjnych zaimplementowanych w wersji mikrousług aplikacji eShopOnContainers: obsługa magistrali zdarzeń, odporność na wiadomości i ponawianie prób, spójność ostateczna i inne.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.

Znacznie prostsze aplikacje referencyjne eShopOnWeb obsługują użycie kontenerów monolitycznych jednego kontenera.The much simpler eShopOnWeb reference application supports single-container monolithic container usage. Aplikacja zawiera jedną aplikację sieci Web, która zawiera tradycyjne widoki MVC, interfejsy API sieci Web i Razor Pages.The application includes one web application that includes traditional MVC views, web APIs, and Razor Pages. Ta aplikacja może być uruchamiana z poziomu głównego rozwiązania przy docker-compose build użyciu docker-compose up poleceń i.This application can be launched from the solution root using the docker-compose build and docker-compose up commands. To polecenie umożliwia skonfigurowanie kontenera dla wystąpienia sieci Web przy użyciu Dockerfile znalezionego w katalogu głównym projektu sieci Web i uruchomienie kontenera na określonym porcie.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. Możesz pobrać źródło dla tej aplikacji z usługi GitHub i uruchomić ją lokalnie.You can download the source for this application from GitHub and run it locally. Nawet ta monolityczna aplikacja nie będzie wdrażana w środowisku kontenera.Even this monolithic application benefits from being deployed in a container environment.

W przypadku jednego z kontenerów wdrożenie to oznacza, że każde wystąpienie aplikacji działa w tym samym środowisku.For one, the containerized deployment means that every instance of the application runs in the same environment. Obejmuje to środowisko deweloperskie, w którym odbywa się wczesne testowanie i programowanie.This includes the developer environment where early testing and development take place. Zespół programistyczny może uruchomić aplikację w środowisku kontenerów, które pasuje do środowiska produkcyjnego.The development team can run the application in a containerized environment that matches the production environment.

Ponadto aplikacje kontenera są skalowane przy niższych kosztach.In addition, containerized applications scale out at lower cost. Użycie środowiska kontenera pozwala zwiększyć udostępnianie zasobów niż tradycyjne środowiska maszyn wirtualnych.Using a container environment enables greater resource sharing than traditional VM environments.

Na koniec konteneryzowania aplikacja wymusza rozdzielenie między logiką biznesową a serwerem magazynu.Finally, containerizing the application forces a separation between the business logic and the storage server. W miarę skalowania aplikacji, wiele kontenerów będzie polegać na jednym fizycznym nośniku magazynowania.As the application scales out, the multiple containers will all rely on a single physical storage medium. Ten nośnik magazynu zazwyczaj jest serwerem o wysokiej dostępności z uruchomioną SQL Server bazą danych.This storage medium would typically be a high-availability server running a SQL Server database.

Obsługa platformy DockerDocker support

eShopOnWebProjekt jest uruchamiany na platformie .NET Core.The eShopOnWeb project runs on .NET Core. W związku z tym może działać w kontenerach opartych na systemie Linux lub Windows.Therefore, it can run in either Linux-based or Windows-based containers. Należy pamiętać, że w przypadku wdrożenia platformy Docker chcesz użyć tego samego typu hosta dla SQL Server.Note that for Docker deployment, you want to use the same host type for SQL Server. Kontenery oparte na systemie Linux umożliwiają mniejsze rozmiary i są preferowane.Linux-based containers allow a smaller footprint and are preferred.

Aby dodać obsługę platformy Docker do istniejącej aplikacji, można użyć programu Visual Studio 2017 lub nowszego, klikając prawym przyciskiem myszy projekt w Eksplorator rozwiązań i wybierając polecenie Dodaj > obsługę platformy Docker.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. Spowoduje to dodanie plików wymaganych i zmodyfikowanie projektu w celu ich użycia.This adds the files required and modifies the project to use them. Bieżący eShopOnWeb przykład ma już te pliki.The current eShopOnWeb sample already has these files in place.

Plik poziomu rozwiązania docker-compose.yml zawiera informacje o obrazach do skompilowania oraz o kontenerach do uruchomienia.The solution-level docker-compose.yml file contains information about what images to build and what containers to launch. Plik umożliwia używanie docker-compose polecenia do uruchamiania wielu aplikacji w tym samym czasie.The file allows you to use the docker-compose command to launch multiple applications at the same time. W tym przypadku uruchamia tylko projekt sieci Web.In this case, it is only launching the Web project. Można go również użyć do skonfigurowania zależności, takich jak oddzielny kontener bazy danych.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

docker-compose.ymlPlik odwołuje się do Dockerfile Web projektu.The docker-compose.yml file references the Dockerfile in the Web project. Służy Dockerfile do określenia, który kontener bazowy będzie używany, oraz sposobu ich konfiguracji.The Dockerfile is used to specify which base container will be used and how the application will be configured on it. Web" Dockerfile :The Web' Dockerfile:

FROM mcr.microsoft.com/dotnet/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/aspnet:3.1 AS runtime
WORKDIR /app
COPY --from=build /app/src/Web/out ./

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

Rozwiązywanie problemów z platformą DockerTroubleshooting Docker problems

Po uruchomieniu aplikacji kontenera nadal będzie ona działać do momentu jej zatrzymania.Once you run the containerized application, it continues to run until you stop it. Możesz zobaczyć, które kontenery są uruchomione przy użyciu docker ps polecenia.You can view which containers are running with the docker ps command. Można zatrzymać uruchomiony kontener przy użyciu docker stop polecenia i OKREŚLAJĄC identyfikator kontenera.You can stop a running container by using the docker stop command and specifying the container ID.

Należy pamiętać, że uruchomione kontenery platformy Docker mogą być powiązane z portami, z których możesz próbować korzystać w środowisku deweloperskim.Note that running Docker containers may be bound to ports you might otherwise try to use in your development environment. W przypadku próby uruchomienia lub debugowania aplikacji przy użyciu tego samego portu co uruchomiony kontener platformy Docker zostanie wyświetlony komunikat o błędzie informujący o tym, że serwer nie może powiązać z tym portem.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. Po ponownym zatrzymywaniu kontenera należy rozwiązać ten problem.Once again, stopping the container should resolve the issue.

Jeśli chcesz dodać obsługę platformy Docker do aplikacji przy użyciu programu Visual Studio, upewnij się, że program Docker Desktop jest uruchomiony, gdy to zrobisz.If you want to add Docker support to your application using Visual Studio, make sure Docker Desktop is running when you do so. Kreator nie będzie działać prawidłowo, jeśli program Docker Desktop nie zostanie uruchomiony po uruchomieniu kreatora.The wizard won't run correctly if Docker Desktop isn't running when you start the wizard. Ponadto Kreator sprawdza bieżący kontener, aby dodać poprawną obsługę platformy Docker.In addition, the wizard examines your current container choice to add the correct Docker support. Jeśli chcesz dodać obsługę kontenerów systemu Windows, musisz uruchomić kreatora, gdy pulpit platformy Docker jest uruchomiony z skonfigurowanymi kontenerami systemu Windows.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. Jeśli chcesz dodać obsługę kontenerów systemu Linux, uruchom kreatora, gdy zainstalowano Aparat Docker z skonfigurowanymi kontenerami systemu Linux.If you want to add support for Linux containers, run the wizard while you have Docker running with Linux containers configured.

Odwołania — wspólne architektury sieci WebReferences – Common web architectures