Fermer

février 2, 2022

Principes de base de .NET : DTO (objet de transfert de données)


Quelque chose de commun dans le développement ASP.NET Core est le transfert de données. Dans ce contexte, nous devons prendre des précautions particulières pour éviter de futurs problèmes. Une bonne pratique consiste à utiliser des DTO qui définiront comment les données seront envoyées sur le réseau.

Dans une application en .NET, une API par exemple, les données contenues dans la base de données sont mappées et envoyées au client. Si cela est fait directement, de nombreux problèmes peuvent survenir, surtout si vous souhaitez manipuler la manière dont ces données sont envoyées et reçues. Pour résoudre ces problèmes, vous pouvez définir un DTO.

Dans cet article, nous verrons les bases des DTO et comment les mettre en œuvre en pratique en créant une API Web dans .NET 6.

Qu'est-ce qu'un DTO ?

Un DTO (Data Transfer Object) est un objet qui définit la manière dont les données seront envoyées entre les applications.

Il est utilisé uniquement pour envoyer et recevoir des données et ne contient en soi aucune logique métier.

Pourquoi Utiliser des DTO ?

L'utilisation de DTO est très courante dans le développement Web avec ASP.NET Core, car ils fournissent des solutions à de nombreux besoins. Voici quelques-unes d'entre elles :

  • Séparer la couche de service de la couche de base de données
  • Masquer les propriétés spécifiques que les clients n'ont pas besoin de recevoir
  • Omettre les propriétés pour réduire la taille de la charge utile
  • Manipuler les objets imbriqués pour les rendre plus pratique pour les clients
  • Évitez les vulnérabilités de « overpost »

Les DTO offrent un moyen efficace de séparer les objets de domaine de la couche de présentation. De cette façon, vous pouvez modifier la couche de présentation sans affecter les couches de domaine existantes, et vice versa.

Dans l'organigramme ci-dessous, le client demande au serveur l'entité DTO, le serveur obtient l'entité de domaine et renvoie l'entité DTO dans le réponse.

L'organigramme DTO montre le client et le serveur, marqués par l'entité de domaine, aux extrémités opposées avec des flèches pointant l'une vers l'autre. Du client au serveur, l'entité DTO est étiquetée RequestOperationDTO. . L'opposé est intitulé ResponseOperationDTO

Approche pratique

Création du projet

Nous allons ensuite créer une application Web simple dans .NET 6 pour démontrer l'utilisation des DTO. Vous pouvez accéder au code source complet sur ce lien : Code source.

Dans le terminal, exécutez la commande suivante pour créer l'application de base, qui sera une API minimale.

dotnet new web -o SellerManager

Création des modèles

Créons la classe de domaine (Seller) qui sera la classe qui reflétera l'entité table de la base de données , à la fois pour récupérer les données et les conserver, ainsi que la classe qui sera le DTO (SellerDto) qui n'exposera que les données pouvant être publiques.

Donc, créez un dossier appelé "Modèles", et à l'intérieur, créez un nouveau classe appelée "Seller" et mettez-y ce code :

public record Seller(Guid Id, string Name DateTime CreatedAt, string Email, string Address, decimal Remise Factor);

Et aussi une nouvelle classe appelée "SellerDto" et mettez-y le code ci-dessous :

public record SellerDto(string Nom, string Email);

Entity Framework Packages

Nous allons maintenant ajouter au projet les bibliothèques dont nous aurons besoin pour implémenter les objets de la base de données . Ensuite, via Nuget Package Manager (Visual Studio) ou via le terminal, ajoutez les packages suivants :

  • Microsoft.EntityFrameworkCore.Sqlite
  • Microsoft.EntityFrameworkCore.Design

Création du contexte de données

Ensuite, créons le contexte de données, qui est la représentation de la base de données. Nous utiliserons SQLite dans cet exemple.

Créez donc un nouveau dossier appelé "Data" et ajoutez-y une nouvelle classe appelée "AppDbContext". À l'intérieur, placez le code ci-dessous.
{
public DbSet<Vendeur> ? Vendeurs { get0 ; ]; }

protected override void OnConfiguring(DbContextOptionsBuilder options)
=

  • >
  • >
  • >
  • >
  • >
  • >
  • 0 .UseSqlite("DataSource = app.db; Cache=Shared");

    protected override void OnModel6590 OnModel6590 OnModel6590 OnModelCreating (ModelBuilder modelBuilder)
    {
    modelBuilder.Entity<Seller>().HasDatanew ]Vendeur(Guid.NouveauGuid(),"John Smith", DateHeure[35].[1945]. UtcNow, "John@mail.com","947 Heritage Road", 10),
    nouveau[19659049]Vendeur(Guid.NouveauGuid(), "Violet Marshall",. UtcNow, "vmarshall@mail.com", "360 Bates Brothers Road", 10)
    )[27]6590 ;
    }
    }

    Dans la classe AppDbContext, nous créons une entité "Sellers" qui représente la table qui sera créée lors de l'exécution ultérieure des commandes Migrations.[19659003]Nous avons également la méthode "OnConfiguring" qui définit les paramètres de la base de données, comme le nom du fichier qui sera généré "app.db".

    Enfin, nous avons la méthode "OnModelCreating" chargée d'insérer des exemples de données lorsque la base de données est générée.

    Exécution des commandes Entity Framework

    Maintenant que le mappage des données est prêt, nous pouvons exécuter les commandes qui créeront la base de données et ajouteront les données initiales qui ont été implémentées dans les étapes précédentes.

    Tout d'abord, avant d'exécuter les commandes, vous devez cliquer avec le bouton droit sur le projet (solution), puis cliquer sur l'option "Reconstruire la solution" – cela évitera les erreurs lors de l'exécution des commandes.

    Puis dans Visual Studio, cliquez sur Outils -> Nuget Package Manager -> Package Manager Console et exécutez les commandes ci-dessous :

    dotnet ef migrations add InitialModel
    mise à jour de la base de données dotnet ef
    

    Ces commandes créeront la base de données à la racine du projet dans le fichier app.db et rempliront la table "seller" avec les données que nous avons préparées dans la méthode "OnModelCreating".

    Utilisation de DTO pour renvoyer des données[19659019]Dans le fichier Program.cs, juste après la création de la variable "builder", ajoutez le code suivant pour créer la configuration DB Context :

    builder.Services. AddDbContext<AppDbContext>();
    

    Et après avoir créé la variable "app", ajoutez le code suivant :

    app.MapGet("/v1/sellers", (Contexte AppDbContext) =>[196591965]{5165] ]var vendeurs = contexte.Vendeurs;
    
        var vendeursDtoList = nouveau nouveau nouveau nouveau  VendeurDà>[19659027]() ;
    
        si (les vendeurs est pas null)
        {15] (var vendeur dans vendeurs)
            {
                var vendeurDto = nouveau Vendeur vendeur.Nom, vendeur.E-mail) ;
    
                sellersDtoList.Ajouter(sellerDto);
            }
        }
    
        return sellersDtoList[1945049]count [19450490][19450490]> 0  ? Résultats.Ok(sellersDtoList)  :[965]Résultats : Introuvable() ;
    
    }).Produit<Vendeur>[9459027][67][194590924] ]);
    

    Dans cette méthode, nous créons un point de terminaison pour interroger la base de données. La variable "sellers" recevra la liste des enregistrements retournés, mais elle ne sera pas envoyée directement au client, car elle contient toutes les données du vendeur, comme le "DiscountFactor", qui dans ce contexte ne doit pas être exposé. Au lieu de cela, les éléments de cette liste seront transmis au DTO (sellerDto), qui renverra les données au client.

    Exécution du projet

    Si vous exécutez le projet et accédez à l'adresse : https : //localhost :/v1/sellersvous aurez la liste des vendeurs renvoyée par la base de données, comme dans l'image ci-dessous :

    Execute Project Result

    Conclusion

    The l'utilisation des DTO est fortement recommandée car elle devient très avantageuse pour les applications, principalement si les données exposées sont sensibles. Au-delà de la possibilité de personnalisation des entités, on peut éviter l'utilisation excessive de requêtes aux API.

    Donc, dans la mesure du possible. , essayez d'utiliser des DTO dans vos applications. En plus d'être une bonne pratique, cela peut éviter des problèmes futurs.

    Dans cet article, nous avons examiné le concept de DTO et ses avantages. Nous avons créé une application qui possède une entité de domaine et qui n'expose que les données nécessaires via l'entité DTO.

    Si vous souhaitez en savoir plus sur ce contenu, je vous propose un excellent article sur le site officiel de Microsoft : Pros et contre de DTO.




  • Source link