web-dev-qa-db-fra.com

La création de ViewModels dans l'API Web est-elle une mauvaise pratique?

Donc, quelqu'un au travail qui est deux fois plus expérimenté que moi, nous a dit que nous ne devons pas créer de classes ViewModel dans le Web API. (Nous utilisons Angular for UI)

À son avis, ViewModel est une approche ASP.NET MVC. Et nous devons en sortir lors de l'utilisation de l'API Web.

Voici mon argument pour utiliser ViewModel dans les WebAPI:

Tables de base de données

Employé

name | phone | categoryId |...Col15

Catégorie

categoryId | Description

Classe C #

Class Employee
{
 public string name {get;set;}
 public phone {get;set;}
 public categoryId {get;set;}
 //...till col15
}

Si votre page d'interface utilisateur affiche uniquement:

 name | phone | categoryId | CategoryDescription

Ne serait-il pas logique de créer une classe ViewModel dans l'API qui n'a que ces 4 propriétés par opposition aux 15 propriétés? Le JSON qui sera retourné par cette classe n'aura que 4 propriétés au lieu de 15 propriétés où 11 d'entre elles contiennent une valeur nulle.

S'il y a une liste de disons 100 employés, cela signifierait 1100 propriétés json vides qui seront envoyées à l'interface utilisateur si nous utilisons la classe Employee d'origine au lieu d'une classe ViewModel.

De plus, si nous nous en tenons à notre classe Employee d'origine, nous devrons peut-être effectuer l'une des opérations suivantes:

  1. CategoryDescription doit être ajouté à la classe Employee d'origine
  2. Effectuez un deuxième appel d'API à partir de l'interface utilisateur pour obtenir la description.
2
SamuraiJack

Ce que tu fais est bien. Vous ne devez exposer que les données nécessaires aux clients.

Il suffit de ne pas l'appeler "modèles de vue" car ce terme a une signification spécifique dans le contexte des interfaces utilisateur et créera de la confusion lorsqu'il est utilisé en dehors de ce contexte. Appelez-le "Data Transfer Objects" et tout le monde sera content.

Ce n'est pas une bonne idée d'exposer des entités directement via une API. Cela crée un couplage étroit, ce qui signifie que tout changement mineur dans la logique métier entraînera des changements de rupture dans l'API (et vice versa). Vous voulez éviter cela.

1
JacquesB

En principe, les frameworks frontaux tels que Angular sont mieux utilisés contre une API REST, ce qui implique que vous n'avez pas de modèles d'affichage et exposez simplement vos ressources comme elles sont.

Cependant, d'après le son, vous n'utilisez pas une API REST mais plutôt une API adaptée aux besoins de l'application frontale. Je dis cela parce que vous mentionnez que l'API en particulier - omet 11 propriétés sur 15 car il sait que le frontend n'en aura pas besoin pour ce cas particulier.

Si tel est le cas, votre API est intrinsèquement consciente de vos vues d'application frontale et vous travaillez efficacement avec les modèles de vue. Il semble que votre collègue suggère simplement de ne pas créer un modèle de vue explicite et essaie plutôt de réutiliser les DTO existants mais avec des propriétés qui sont intentionnellement conservées vides, ce qui n'est pas une bonne pratique.

Donc, pour résumer, la position "sans vue" fonctionne si vous avez une API REST. Si vous avez une API qui gère les demandes personnalisées et rédige automatiquement les données car elle sait ce que le frontend affichera/ne sera pas affiché, alors la position "sans vue" est contradictoire avec la façon dont l'API est développée.


Aditionellement:

À son avis, ViewModel est une approche ASP.NET MVC.

MVC signifie Model-View-Controller. MVC n'a pas de modèles d'affichage. MVVM (Model-View-ViewModel) a cependant des viewmodels.

Je ne sais pas si cette confusion est de votre côté ou du côté de votre collègue, mais il est presque impossible de discuter de manière productive de l'utilisation des modèles de vue (ou de leur absence) si l'une des parties ne peut pas distinguer MVC et MVVM.
À tout le moins, vous utiliseriez le mauvais nom (modèle de vue ou modèle), ce qui rend très difficile pour les autres personnes de fournir des commentaires précis en fonction de votre explication.

1
Flater

Oui, c'est une mauvaise pratique.

Essentiellement, vous déplacez la logique de votre application cliente javascript vers le côté serveur.

Cela fonctionne bien lorsque vous effectuez des demandes de page avec peu ou pas de logique côté client, mais pas lorsque vous avez une application de page unique où toute la logique de présentation est au moins censée être côté client pour profiter des divers avantages qui peuvent en résulter. .

Ainsi, dans votre premier exemple, si vous créez le EmployeeViewModel avec des champs réduits, mais que vous avez ensuite besoin de l'un de ces champs sur le front-end, vous devez maintenant modifier le front-end et le back-end.

dans votre deuxième exemple où vous enrichissez l'employé avec la description de la catégorie, votre client est tout à fait capable de demander les informations séparément, de les conserver en mémoire et de les joindre aux employés, de les utiliser dans les listes déroulantes, etc., etc.

Dans chaque cas, l'ajout d'un modèle de vue au serveur réduit la flexibilité et les options disponibles dans votre code côté client

1
Ewan

Selon moi, si vous utilisez un modèle de référentiel dans votre projet d'API Web, dans ce cas, il est recommandé d'utiliser le modèle de vue pour l'interaction directe avec la base de données du côté frontal. Dans d'autres cas, vous pouvez effectuer des opérations sans utiliser de modèles de vue.

0
Ishan Shah