Udostępnij za pośrednictwem


Część 3. Tworzenie kontrolera administratora

Autor: Rick Anderson

Pobieranie ukończonego projektu

Dodawanie kontrolera administratora

W tej sekcji dodamy kontroler internetowego interfejsu API, który obsługuje operacje CRUD (tworzenie, odczytywanie, aktualizowanie i usuwanie) na produktach. Kontroler będzie używać programu Entity Framework do komunikowania się z warstwą bazy danych. Tylko administratorzy będą mogli używać tego kontrolera. Klienci będą uzyskiwać dostęp do produktów za pośrednictwem innego kontrolera.

W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy folder Controllers. Wybierz pozycję Dodaj , a następnie pozycję Kontroler.

Zrzut ekranu przedstawiający menu kontrolerów w Eksploratorze Rozwiązań. Opcja dodawania jest zaznaczona, a kontroler jest wyróżniony.

W oknie dialogowym Dodawanie kontrolera nadaj kontrolerowi AdminControllernazwę . W obszarze Szablon wybierz pozycję "API controller z akcjami odczytu/zapisu, przy użyciu Entity Framework". W obszarze Klasa modelu wybierz pozycję "Product (ProductStore.Models)". W obszarze Kontekst danych wybierz pozycję "<Nowy kontekst> danych".

Zrzut ekranu przedstawiający okno dialogowe Dodaj kontroler. Menu klasy kontekstu danych jest otwarte i wyróżniono nowy kontekst danych.

Uwaga / Notatka

Jeśli lista rozwijana Klasa modelu nie zawiera żadnych klas modelu, upewnij się, że projekt został skompilowany. Program Entity Framework używa odbicia, więc potrzebuje skompilowanego zestawu.

Wybranie pozycji "<Nowy kontekst danych" spowoduje otwarcie okna dialogowego > danych. Nadaj nazwę kontekstowi danych ProductStore.Models.OrdersContext.

Zrzut ekranu przedstawiający okno dialogowe nowego kontekstu danych. W polu tekstowym widoczna jest wpisana nazwa nowego kontekstu danych.

Kliknij przycisk OK , aby zamknąć okno dialogowe Nowy kontekst danych . W oknie dialogowym Dodawanie kontrolera kliknij przycisk Dodaj.

Oto, co dodano do projektu:

  • Klasa o nazwie OrdersContext , która pochodzi z dbContext. Ta klasa zapewnia klej między modelami POCO i bazą danych.
  • Kontroler internetowego interfejsu API o nazwie AdminController. Ten kontroler obsługuje operacje CRUD na Product instancjach. Używa klasy OrdersContext do komunikacji z programem Entity Framework.
  • Nowe parametry połączenia bazy danych w pliku Web.config.

Zrzut ekranu przedstawiający widok projektu Eksplorator rozwiązań. Wyróżniono pozycje AdminController dot c s i OrdersContext dot c s.

Otwórz plik OrdersContext.cs. Zwróć uwagę, że konstruktor określa nazwę parametrów połączenia bazy danych. Ta nazwa odnosi się do parametrów połączenia dodanych do Web.config.

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

Dodaj następujące właściwości do OrdersContext klasy:

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

Zestaw dbSet reprezentuje zestaw jednostek, których można wykonywać zapytania. Oto kompletna lista dla OrdersContext klasy:

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; }
}

Klasa AdminController definiuje pięć metod implementujących podstawowe funkcje CRUD. Każda metoda odpowiada identyfikatorowi URI, który klient może wywołać:

Metoda kontrolera Opis URI Metoda HTTP
PobierzProdukty Pobiera wszystkie produkty. api/products GET
PobierzProdukt Znajduje produkt według identyfikatora. api/products/id GET
UmieśćProdukt Aktualizuje produkt. api/products/id POŁÓŻ
PostProduct Tworzy nowy produkt. api/products POST
UsuńProdukt Usuwa produkt. api/products/id USUŃ

Każda metoda wywołuje OrdersContext do wykonywania zapytań względem bazy danych. Metody, które modyfikują kolekcję (PUT, POST i DELETE), wywołują db.SaveChanges w celu utrwalenia zmian w bazie danych. Kontrolery są tworzone na żądanie HTTP, a następnie usuwane, dlatego należy utrwalać zmiany przed zwróceniem metody.

Dodawanie inicjatora bazy danych

Program Entity Framework ma dobrą funkcję, która umożliwia wypełnienie bazy danych podczas uruchamiania i automatyczne ponowne utworzenie bazy danych przy każdej zmianie modeli. Ta funkcja jest przydatna podczas opracowywania, ponieważ zawsze masz pewne dane testowe, nawet jeśli zmienisz modele.

W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy folder Models i utwórz nową klasę o nazwie OrdersContextInitializer. Wklej następującą implementację:

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();
        }
    }
}

Dziedzicząc z klasy DropCreateDatabaseIfModelChanges , informujemy platformę Entity Framework o usuwaniu bazy danych za każdym razem, gdy modyfikujemy klasy modelu. Gdy program Entity Framework tworzy (lub ponownie tworzy) bazę danych, wywołuje metodę Seed , aby wypełnić tabele. Używamy metody Seed , aby dodać przykładowe produkty oraz przykładową kolejność.

Ta funkcja doskonale nadaje się do testowania, ale nie używaj klasy DropCreateDatabaseIfModelChanges w środowisku produkcyjnym, ponieważ możesz utracić dane, jeśli ktoś zmieni klasę modelu.

Następnie otwórz plik Global.asax i dodaj następujący kod do metody Application_Start :

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

Wysyłanie żądania do kontrolera

Na tym etapie nie napisaliśmy żadnego kodu klienta, ale można wywołać internetowy interfejs API przy użyciu przeglądarki internetowej lub narzędzia debugowania HTTP, takiego jak Fiddler. W programie Visual Studio naciśnij klawisz F5, aby rozpocząć debugowanie. W przeglądarce internetowej zostanie otwarty http://localhost:*portnum*/adres, gdzie numer portu to pewien numer portu.

Wyślij żądanie HTTP do adresu "http://localhost:*portnum*/api/admin. Pierwsze żądanie może być powolne do ukończenia, ponieważ program Entity Framework musi utworzyć i zainicjować bazę danych. Odpowiedź powinna wyglądać podobnie do następującej:

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}]