Partie 3 : Création d’un contrôleur Administration

par Rick Anderson

Télécharger le projet terminé

Ajouter un contrôleur Administration

Dans cette section, nous allons ajouter un contrôleur d’API web qui prend en charge les opérations CRUD (créer, lire, mettre à jour et supprimer) sur les produits. Le contrôleur utilisera Entity Framework pour communiquer avec la couche de base de données. Seuls les administrateurs pourront utiliser ce contrôleur. Les clients accèdent aux produits via un autre contrôleur.

Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le dossier Contrôleurs. Sélectionnez Ajouter , puis Contrôleur.

Capture d’écran du menu Solutions Explorer contrôleurs. L’option Ajouter est sélectionnée et Le contrôleur est mis en surbrillance.

Dans la boîte de dialogue Ajouter un contrôleur , nommez le contrôleur AdminController. Sous Modèle, sélectionnez « Contrôleur d’API avec des actions de lecture/écriture, à l’aide d’Entity Framework ». Sous Classe de modèle, sélectionnez « Product (ProductStore.Models) ». Sous Contexte de données, sélectionnez «< Nouveau contexte> de données ».

Capture d’écran de la boîte de dialogue Ajouter un contrôleur. Le menu de la classe de contexte de données est ouvert et le nouveau contexte de données est mis en surbrillance.

Notes

Si la liste déroulante Classe de modèle n’affiche aucune classe de modèle, vérifiez que vous avez compilé le projet. Entity Framework utilise la réflexion et a donc besoin de l’assembly compilé.

La sélection de «< Nouveau contexte> de données » ouvre la boîte de dialogue Nouveau contexte de données . Nommez le contexte ProductStore.Models.OrdersContextde données .

Capture d’écran de la boîte de dialogue nouveau contexte de données. Une zone de texte affiche le nom du nouveau contexte de données tapé.

Cliquez sur OK pour ignorer la boîte de dialogue Nouveau contexte de données . Dans la boîte de dialogue Ajouter un contrôleur , cliquez sur Ajouter.

Voici ce qui a été ajouté au projet :

  • Classe nommée OrdersContext qui dérive de DbContext. Cette classe fournit le lien entre les modèles POCO et la base de données.
  • Un contrôleur d’API web nommé AdminController. Ce contrôleur prend en charge les opérations CRUD sur Product les instances. Il utilise la OrdersContext classe pour communiquer avec Entity Framework.
  • Nouvelle chaîne de connexion de base de données dans le fichier Web.config.

Capture d’écran de l’affichage de projet Solutions Explorer. AdminController dot c s et OrdersContext dot c s sont mis en surbrillance.

Ouvrez le fichier OrdersContext.cs. Notez que le constructeur spécifie le nom de la chaîne de connexion de base de données. Ce nom fait référence à la chaîne de connexion qui a été ajoutée à Web.config.

public OrdersContext() : base("name=OrdersContext")

Ajoutez les propriétés suivantes à la classe OrdersContext :

public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }

Un DbSet représente un ensemble d’entités qui peuvent être interrogées. Voici la liste complète de la OrdersContext classe :

public class OrdersContext : DbContext
{
    public OrdersContext() : base("name=OrdersContext")
    {
    }

    public DbSet<Order> Orders { get; set; }
    public DbSet<OrderDetail> OrderDetails { get; set; }
    public DbSet<Product> Products { get; set; }
}

La AdminController classe définit cinq méthodes qui implémentent des fonctionnalités CRUD de base. Chaque méthode correspond à un URI que le client peut appeler :

Controller, méthode Description URI Méthode HTTP
GetProducts Obtient tous les produits. api/products GET
GetProduct Recherche un produit par ID. api/products/id GET
PutProduct Mises à jour un produit. api/products/id PUT
PostProduct Crée un produit. api/products POST
DeleteProduct Supprime un produit. api/products/id Suppression

Chaque méthode appelle pour OrdersContext interroger la base de données. Les méthodes qui modifient la collection (PUT, POST et DELETE) appellent db.SaveChanges pour conserver les modifications apportées à la base de données. Les contrôleurs sont créés par requête HTTP, puis supprimés. Il est donc nécessaire de conserver les modifications avant le retour d’une méthode.

Ajouter un initialiseur de base de données

Entity Framework dispose d’une fonctionnalité intéressante qui vous permet de remplir la base de données au démarrage et de recréer automatiquement la base de données chaque fois que les modèles changent. Cette fonctionnalité est utile pendant le développement, car vous avez toujours des données de test, même si vous modifiez les modèles.

Dans Explorateur de solutions, cliquez avec le bouton droit sur le dossier Models et créez une classe nommée OrdersContextInitializer. Collez l'implémentation suivante :

namespace ProductStore.Models
{
    using System;
    using System.Collections.Generic;
    using System.Data.Entity;

    public class OrdersContextInitializer : DropCreateDatabaseIfModelChanges<OrdersContext>
    {
        protected override void Seed(OrdersContext context)
        {
            var products = new List<Product>()            
            {
                new Product() { Name = "Tomato Soup", Price = 1.39M, ActualCost = .99M },
                new Product() { Name = "Hammer", Price = 16.99M, ActualCost = 10 },
                new Product() { Name = "Yo yo", Price = 6.99M, ActualCost = 2.05M }
            };

            products.ForEach(p => context.Products.Add(p));
            context.SaveChanges();

            var order = new Order() { Customer = "Bob" };
            var od = new List<OrderDetail>()
            {
                new OrderDetail() { Product = products[0], Quantity = 2, Order = order},
                new OrderDetail() { Product = products[1], Quantity = 4, Order = order }
            };
            context.Orders.Add(order);
            od.ForEach(o => context.OrderDetails.Add(o));

            context.SaveChanges();
        }
    }
}

En héritant de la classe DropCreateDatabaseIfModelChanges , nous disons à Entity Framework de supprimer la base de données chaque fois que nous modifions les classes de modèle. Quand Entity Framework crée (ou recrée) la base de données, il appelle la méthode Seed pour remplir les tables. Nous utilisons la méthode Seed pour ajouter des exemples de produits et un exemple de commande.

Cette fonctionnalité est idéale pour les tests, mais n’utilisez pas la classe DropCreateDatabaseIfModelChanges en production, car vous risquez de perdre vos données si quelqu’un modifie une classe de modèle.

Ensuite, ouvrez Global.asax et ajoutez le code suivant à la méthode Application_Start :

System.Data.Entity.Database.SetInitializer(
    new ProductStore.Models.OrdersContextInitializer());

Envoyer une demande au contrôleur

À ce stade, nous n’avons pas écrit de code client, mais vous pouvez appeler l’API web à l’aide d’un navigateur web ou d’un outil de débogage HTTP tel que Fiddler. Dans Visual Studio, appuyez sur F5 pour démarrer le débogage. Votre navigateur web s’ouvre sur http://localhost:*portnum*/, où portnum est un numéro de port.

Envoyez une requête HTTP à «http://localhost:*portnum*/api/admin . La première demande peut être lente, car Entity Framework doit créer et amorcer la base de données. La réponse doit ressembler à ce qui suit :

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Mon, 18 Jun 2012 04:30:33 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 175
Connection: Close

[{"Id":1,"Name":"Tomato Soup","Price":1.39,"ActualCost":0.99},{"Id":2,"Name":"Hammer",
"Price":16.99,"ActualCost":10.00},{"Id":3,"Name":"Yo yo","Price":6.99,"ActualCost":
2.05}]