hn-dotnet/README.md
2020-12-10 09:42:56 +01:00

123 lines
4.0 KiB
Markdown

# hn-dotnet : un clone d'Hacker News en dotnet !
Le but est de réaliser de A à Z une application Web imitant le fonctionnement de Hacker News en abordant des bonnes pratiques de développement en .Net.
## Ressources utiles
- https://aspnetcore.readthedocs.io/en/stable/mvc/index.html
- https://andrewlock.net/an-introduction-to-viewcomponents-a-login-status-view-component/
- https://stackoverflow.com/a/47011478
- https://stackoverflow.com/a/34291650
## Commençer par le domaine !
Mise en place de la librairie du domaine qui contiendra nos objets métiers.
## Notre premier cas d'utilisation
Mise en place de la couche applicative avec `MediatR` et implémentation du premier cas d'utilisation.
## Le site internet en MVC
### Options pattern
Permet d'avoir des objets de configuration facilement sortable depuis l'appsettings. Utilisation de https://docs.microsoft.com/fr-fr/aspnet/core/fundamentals/configuration/options?view=aspnetcore-5.0.
### Ajout des messages "flashs"
Permet de notifier l'utilisateur d'une action. Utilisation des `TempData` (données supprimées à la prochaine requête ou après la lecture).
### Factoriser des éléments d'interface
#### Partial views
Simple fichier permettant de partager du markup sans logique.
```razor
@await Html.PartialAsync("_Partial", model)
<partial name="_Partial" model="@Model">
```
#### View components
Permet de partager du rendu ET de la logique. Plusieurs manière de le déclarer (étendre `ViewComponent`, fichier terminant par `ViewComponent` ou décorateur associé).
```razor
@await Component.InvokeAsync("VComponent")
<component type="@typeof(VComponent)" param-arg="@Model" />
<vc:VComponent arg="@Model"> // Nécessite d'ajouter les tag helpers et de builder avec (dans le ViewImports) `@addTagHelper *, YourAssembly`
```
#### Razor components (rendu statique)
Proche de ce qui est fait en Blazor mais sans la partie interactivité. Possibilité de les afficher sans utiliser Blazor du tout mais plusieurs concession, notamment plus de TagHelper type `asp-action`...
#### Tag Helpers
## Démarche
On crée un fichier solution avec `dotnet new sln`. On pourra alimenter ce fichier sln avec la commande `dotnet sln add DirProjet`.
Commençons par le commencement, les building blocks, des classes pour nous faciliter la vie !
```console
$ mkdir BuildingBlocks
$ cd BuildingBlocks
$ dotnet new classlib && dotnet new gitignore
```
Ensuite viens le domaine :
```console
$ mkdir Domain
$ cd Domain
$ dotnet new classlib && dotnet new gitignore
```
On crée ensuite les différentes classes nécessaires au fonctionnement de l'application...
Ensuite viens la couche applicative avec nos **commands** et nos **queries** pour un couplage faible.
```console
$ mkdir Application
$ cd Application
$ dotnet new classlib && dotnet new gitignore
```
On ajoute aussi le package MediatR avec `dotnet add package MediatR` et la référence au domaine avec `dotnet add reference ../Domain`.
Création du répertoire et de la première appli razor pour exposer le domaine.
```console
$ mkdir Apps
$ cd Apps
$ dotnet new mvc -o Website
$ cd Website
$ dotnet new gitignore
```
On peut aussi installer les outils de scaffolding avec `dotnet tool install -g dotnet-aspnet-codegenerator`...
On ajoute les extensions MediatR pour pouvoir facilement enregistrer les services dans le conteneur IoC d'ASP.Net Core avec `dotnet add package MediatR.Extensions.Microsoft.DependencyInjection`.
Pour la couche d'infrastructure, il nous faut implémenter notre `ILinkRepository` avec EF Core dans un nouveau projet `Infrastructure`.
```console
$ dotnet new classlib -o Infrastructure
$ cd Infrastructure
$ dotnet new gitignore
$ dotnet add package Microsoft.EntityFrameworkCore.Sqlite
$ dotnet add package Microsoft.EntityFrameworkCore.Design
```
On installe les outils Entity framework `dotnet tool install --global dotnet-ef`.
Pour plus tard, pour la génération de doc :
project.csproj
<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<DocumentationFile>bin\YourApi.XML</DocumentationFile>
</PropertyGroup>