ASP.NET Core MVC: Модели и интерфейсы для интернет-магазина

Этот урок посвящен созданию моделей и интерфейсов для хранения и извлечения данных в проекте ASP.NET Core MVC. Пример — интернет-магазин по продаже автомобилей.

Создание моделей

Модели предназначены для хранения информации. В данном случае — текстовой информации о товарах (автомобилях) и их категориях. В дальнейшем информация будет храниться в базе данных, но сейчас работа ведется непосредственно в проекте.

Создание папок

  1. Создайте папку Data в проекте.
  2. Создайте папку Models внутри папки Data.

Модель Category

Создайте C# класс Category. Класс содержит поля для хранения информации о категориях автомобилей:

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    //public List<Car> Cars { get; set; } // Закомментировано, реализуется позже
}

Модель Car

Создайте C# класс Car. Класс содержит поля для хранения информации о каждом автомобиле:

public class Car
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string ShortDescription { get; set; }
    public string LongDescription { get; set; }
    public string ImgUrl { get; set; }
    public short Price { get; set; }
    public bool IsFeatured { get; set; }
    public bool Available { get; set; }
    public int CategoryId { get; set; }
    public Category Category { get; set; }
    //public List<Car> Cars { get; set; } // Закомментировано, реализуется позже
}

В модели Car CategoryId указывает на ID категории, к которой относится автомобиль, а свойство Category представляет объект Category, обеспечивающий связь «один-ко-многим» между категориями и автомобилями.

Создание интерфейсов

Интерфейсы определяют функции для извлечения данных из моделей.

Создание папки Interfaces

Создайте папку Interfaces внутри папки Data.

Интерфейс ICategoryRepository

Создайте интерфейс ICategoryRepository:

public interface ICategoryRepository
{
    IEnumerable<Category> AllCategories { get; }
}

Интерфейс объявляет функцию AllCategories, возвращающую все категории.

Интерфейс ICarRepository

Создайте интерфейс ICarRepository:

public interface ICarRepository
{
    IEnumerable<Car> Cars { get; }
    IEnumerable<Car> FeaturedCars { get; }
    Car GetCar(int id);
}

Интерфейс содержит функции: Cars (возвращает все автомобили), FeaturedCars (возвращает только автомобили, отмеченные как рекомендуемые), и GetCar (возвращает один автомобиль по ID).

Реализация интерфейсов

Реализация интерфейсов позволяет наполнить модели данными.

Создание папки Repositories

Создайте папку Repositories внутри папки Data.

Реализация CategoryRepository

Создайте класс CategoryRepository, реализующий ICategoryRepository:

public class CategoryRepository : ICategoryRepository
{
    public IEnumerable<Category> AllCategories => new List<Category>()
    {
        new Category { Id = 1, Name = "Электромобили", Description = "Электромобили различных марок" },
        new Category { Id = 2, Name = "Автомобили с бензиновым двигателем", Description = "Автомобили с бензиновыми двигателями" }
    };
}

Реализация CarRepository

Создайте класс CarRepository, реализующий ICarRepository:

public class CarRepository : ICarRepository
{
    private readonly ICategoryRepository _categoryRepository;

    public CarRepository(ICategoryRepository categoryRepository)
    {
        _categoryRepository = categoryRepository;
    }

    public IEnumerable<Car> Cars { get; } = new List<Car>()
    {
       // ... (Здесь создаются объекты Car с данными о автомобилях, включая ссылки на категории через CategoryId) ...
    };


    public IEnumerable<Car> FeaturedCars => Cars.Where(c => c.IsFeatured);

    public Car GetCar(int id) => Cars.FirstOrDefault(c => c.Id == id);
}

В CarRepository используется вложенный _categoryRepository для доступа к данным о категориях и создания связей «один-ко-многим».

В этом уроке созданы модели данных (Category и Car), интерфейсы для доступа к ним (ICategoryRepository и ICarRepository), и реализация этих интерфейсов (CategoryRepository и CarRepository). В следующих уроках эти модели и интерфейсы будут использоваться для отображения данных на сайте. Сейчас данные хранятся непосредственно в коде, в дальнейшем — в базе данных.

Что будем искать? Например,программа