Napojení na databázi

ASP.NET MVC

SSŠVT


Entity Framework

Abychom mohli data, která si vyměňuje klient se serverem, persistovat, potřebujeme několik věcí.

  1. Připravit databázi
  2. Upravit business objekty
  3. Připravit datovou vrstvu
  4. Připravit aplikační vrstvu
  5. Připravit prezentační vrstvu
  6. Propojit vrstvy pomocí Dependency Injection

Databáze

Především potřebujeme databázi a v ní nějaké databázové tabulky. Tabulky budou odpovídat našim business objektům.


Business objekty

V business objektech potřebujeme ještě doplnit toto:


Datová vrstva a ORM

Dále vytvoříme interface a repo třídu pro daný business objekt. To je tzv. datová vrstva (DAO).

public interface IHouseRepo
{
    IList<House> GetList();
    IList<House> FindList(House house);
    bool Exists(House house);
    House Load(House house);
    void Store(House house);
    void Add(House house);
    void Remove(House house);
}
        

Implementace interface-u IHouseRepo je ve třídě HouseRepo.


Aplikační vrstva

Dále vytvoříme interface a servisní třídu pro tentýž business objekt. To je tzv. aplikační vrstva (někdy též business logic layer).

using System;
using System.Collections.Generic;
using PetEShopWebMVC.BusinessObjects;

namespace PetEShopWebMVC.Interfaces.Services.Test
{
    public interface IHouseService
    {
        House SaveHouse(House house);
    }
}
        

Implementace interface-u IHouseService je ve třídě HouseService.


Prezentační vrstva

Vrstva MVC (model-view-controller) je de facto prezentační vrstva celé aplikace.

V případě use-case-u pro editaci business objektu House použijeme tyto třídy a soubory:

Business objekt House už máme hotový. Jen ho použijeme pro view EditHouse jako model.

Soubor EditHouse.cshtml jsme nechali vygenerovat právě k business objektu House. Tedy by měl zrcadlit vlastnosti našeho domu (popisku, šířku, délku).

Do třídy HouseController přidáme dvě akce (pro HTTP GET a HTTP POST).

První akce (ShowEditHouse) zobrazí prázdný editační formulář.

// GET /houses/edit-house
[HttpGet("edit-house")]
public IActionResult ShowEditHouse()
{
    return View("/Views/House/EditHouse.cshtml", new House());
}
        

Druhá akce (EditHouse) zpracuje data z webového formuláře (vypíše je do logu a uloží je do db). Vrací HTTP status code 200, což znamená OK (vše v pořádku).

// POST /House/EditHouse
[HttpPost("/houses")]
public IActionResult EditHouse([FromForm] House house)
{
    Console.WriteLine($"Descr.:  {house.Description}  Size: {house.Width}x{house.Length} m");
    this.houseService.SaveHouse(house);
    return new OkResult();
}
        

Dependency Injection

Ještě musíme jednotlivé vrstvy naší appky propojit. Využijeme tzv. Dependency Injection (DI):