Wstęp i opis
Celem laboratorium jest zapoznanie się z najpopularniejszymi rozwiązaniami technologii .Net. Podczas zajęć przedstawione zostaną podstawy:
- tworzenia asynchronicznego web API
- mapowania obiektowo-relacyjnego
- Clean Architecture
- CRUD (Create, Read, Update, Delete)
- testów jednostkowych
- konteneryzacji
Budowane rozwiązanie oparte zostanie na technologiach: .Net 6, EF Core 6.0, Docker, SqlLite, XUnit oraz Moq. Całość laboratoriów jak i prezentowane przykłady zostaną przedstawione na środowisku JetBrains Rider.
Wymagania
Do wykonania zadań podczas laboratoriów, wymagane jest zainstalowanie poniższych narzędzi:
- .Net 6 SDK
- Docker/Podman
- Visual Studio Professional/Enterprise lub JetBrains Rider
- Databrowser for SQLite/JetBrains DataGrip
- Postman
Główne założenia projektu
Na zajęciach zaprojektowany oraz zaimplementowany zostanie serwis do zarządzania najmem nieruchomości. Do funkcjonalności systemu należeć będą:
- Dodawanie nieruchomości
- Wyświetlanie wszystkich nieruchomości
- Wyświetlenie nieruchomości po zadanym atrybucie
- Edycja nieruchomości
- Usuwanie nieruchomości
- Tworzenie konta właściciela nieruchomości
- Edycja konta właściciela
- Usunięcie konta właściciela
- Tworzenie konta najemcy
- Edycja konta najemcy
- Usunięcie konta najemcy
- Przypisanie konta najemcy do nieruchomości
Tworzenie projektu
Zaczynamy od uruchomienia środowiska programistycznego. Po jego załadowaniu wyświetli się panel z listą wcześniej utworzonych projektów. W okienku wybieramy New Solution
.
W następnym oknie należy wybrać rodzaj tworzonego projektu: ASP.NET Core Web Application
oraz ustawić podstawową konfigurację projektu:
- Nazwa solucji (Solution Name): ApartmentRental.API
- Nazwa projektu (Project Name): AparmentRental.API
- Katalog solucji (Solution Directory)
- SDK: 6.
- Typ (Type): Web API
- Framework: net6.
- Autoryzacja (Auth): No authentication
- Docker Support: Linux
Projekt zostanie stworzony po wciśnięciu przycisku Create
Struktura utworzonego projektu
Po stworzeniu nowego projektu, należy zwrócić uwagę na szkielet aplikacji, który składy się z następujących plików oraz katalogów:
Dependencies
- zależności projektuProperties
- pliki konfiguracyjnelaunchSettings.json
- plik konfiguracyjny uruchomienia aplikacji ASP.NET Core^Controllers
- katalog z kontroleramiWeatherForecastController.cs
- przykładowa klasa z implementacją RESTowego kontrolera^appsettings.json
- plik konfiguracyjny aplikacji wykorzystywany do budowania produkcyjnegoappsettings.Development.json
- plik konfiguracyjny aplikacji wykorzystywany do budowania deweloperskiegoDockerFile
- plik z konfiguracją budowania kontenera DockerowegoProgram.cs
- klasa konfiguracyjna aplikacjiWeatherForecast.cs
- przykładowa klasa z modelem obiektu zwracanego przezWeatherForecastController.cs
Projekt architektury aplikacji
Czysta architektura stawia logikę biznesową i model aplikacji w centrum projektu. Zamiast uzależniać logikę biznesową od dostępu do danych lub innych kwestii związanych z infrastrukturą, zależność ta jest odwrócona: szczegóły infrastruktury i implementacji zależą od rdzenia aplikacji (Application Core). Funkcjonalność ta jest osiągana poprzez definiowanie abstrakcji lub interfejsów w rdzeniu aplikacji, które są następnie implementowane przez typy zdefiniowane w warstwie infrastruktury. Popularnym sposobem wizualizacji tej architektury jest użycie serii koncentrycznych okręgów, podobnych do cebuli (onion architecture).
W naszej aplikacji zdefiniujemy cztery podprojektów:
- ApartmentRental.API
- ApartmentRental.Core
- ApartmentRental.Infrastructure
- ApartmentRental.Tests
Przejdźmy do dodania wspomnianych wyżej warstw do tworzonego przez nas serwisu. Aby to zrobić, należy kliknąć prawym przyciskiem myszy na solucję i wybrać Add -> New Projects...
W nowym oknie wyświetli się konfiguracja nowego projektu. Z menu Templates .NET/ .NET Core
należy wybrać Class Library
. W Project name uzupełniamy nazwę projektu, który będzie naszą warstwą. Czynność powtarzamy dla każdej warstwy. Dodatkowo nasza aplikacja powinna zakładać posiadanie testów jednostkowych. Dodajmy do solucji kolejny projekt (Unit Test Project)
. Naszą główną biblioteką za pomocą której będziemy implementować testy jednostkowe będzie xUnit
. Podczas tworzenia projektu z testami, framework powinien zostać zdefiniowany z pola Type
.
Po stworzeniu wszystkich projektów nasza solucja powinna prezentować się następująco:
Projekt API który został wygenerowany podczas tworzenia solucji będzie odgrywał role interfejsu użytkownika.
Pierwsze uruchomienie serwisu
Stworzony serwis można uruchomić w dwóch trybach, w dwóch konfiguracjach oraz kilku profilach. Tryby można podzielić na tryb zwykły oraz tryb do debugowania kodu. Z kolei konfiguracje dzielą się na konfigurację debugowania (do pracy lokalnej) oraz konfigurację releasową (budującą kod w takiej formie z jaką styczność będą mieli klienci czyli tzw. produkcyjna/releasowa). Rodzaje możliwych profili, które służą do podstawowej konfiguracji uruchomienia aplikacji, można znaleźć w pliku launchSettings.json
w folderze Properties
. Aby uruchomić aplikację w trybie i konfiguracji debugowania należy wybrać opcje jak na załączonym niżej obrazku i kliknąć przycisk Debug
:
Uruchomiona aplikacja powinna uruchomić się w trybie https oraz zwykłym http, na dwóch różnych portach np. https://localhost:7299
, http://localhost:5218
. Informacja na których portach aplikacja się uruchomiła widoczna jest w oknie terminala bądź można ją sprawdzić w pliku launchSettings.json
.
Pierwsze testowe zapytanie HTTP
Po stworzeniu nowego projektu wygenerowany został kontroler REST API WeatherForecastController
. Posiada on zaimplementowaną metodę GET, która zwraca krótką informację o prognozie pogody.
Do przetestowania działania API, wykorzystamy narzędzie Postman. Po pobraniu i instalacji narzędzia, należy stworzyć w nim konto użytkownika. Po całej operacji, powinno nam się pojawić poniższe okno:
Wykonajmy teraz pierwsze zapytanie do naszego serwisu. W tym celu stworzymy sobie w narzędziu kolekcję, do której sukcesywnie podczas zajęć będziemy dodawać nowe zapytania. W Postmanie należy wybrać przycisk New
, a w oknie dialogowym które pojawi się zaraz po wybraniu tego przycisku, należy wybrać Collection
. Kolekcję nazwijmy tak samo jak nasz projekt - ApartmentRental.API
. Klikając prawym przyciskiem myszy na kolekcję, wybierzmy Add Request
, by dodać nowe zapytanie.
Nowe zapytanie nazwijmy Weathers
. W okienku Enter request URL
, należy wpisać adres naszej aplikacji, ze ścieżką która odwołuje się do naszego endpoint’a. Domyślnie w .Netcie adres ścieżki tworzony jest na podstawie atrybutu Route
z parametrem dodanym do nagłówka klasy oraz atrybuty Http
np. HttpGet, HttpPost itd. dodanego do nagłówka metody. W naszym przypadku, atrybut Route
, przyjmuje parametr [controller]
, który mapuje sufiks nazwy klasy do nazwy ścieżki. Łącząc adres z którym uruchomiła się aplikacja oraz podane atrybuty, ścieżka do wykonania zapytania będzie prezentowała się następująco: https://localhost:7299/WeatherForecast/
. Wpiszmy poniższy adres, kliknijmy Send
i zobaczmy co zwróci aplikacja.
W zakładce Body widzimy że aplikacja zwróciła nam odpowiedź - krótką prognozę pogody. Zwróćmy uwagę również na kod odpowiedzi HTTP - 200, który informuje nas o prawidłowym wykonaniu zapytania. W zakładce Headers
możemy zobaczyć więcej informacji. W nagłówku odpowiedzi otrzymaliśmy informację o serwerze na którym uruchomiona jest aplikacja, dacie, formacie odpowiedzi oraz o typie kodowania transferu.
Automatyczna dokumentacja API
W stworzonym przez nas projekcie została dodana konfiguracja tworzenia automatycznej dokumentacji enepointów - Swagger. Dostępna jest ona w formie przejrzystego interfejsu z poziomu przeglądarki internetowej. Za pomocą narzędzia, możemy w szybki sposób przyjrzeć się konfiguracji naszych endpointów, jak i wysłać testowe zapytanie. Aby przejść do dokumentacji, w pasku adresu przeglądarki internetowej, należy wpisać adres: http://localhost:7299/swagger
.
Ważne! Zwróć uwagę na jakim porcie wystartowała aplikacji na Twoim lokalnym środowisku!
Zadania
- Na podstawie stworzonego projektu stwórz lokalne repozytorium GIT
- Wystaw stworzone repozytorium na Githuba
- Wystawione repozytorium musi być publiczne
- Dodaj odpowiednie Readme.md opisujące projekt
- Link do stworzonego repozytorium na Githubie wyślij w wiadomości mailowej do prowadzącego. Tytuł wiadomości email powinien być w określonym formacie: [.Net][Rodzaj studiów][Nr grupy] Imię nazwisko - nr indeksu