Как компоненты MVC взаимодействуют друг с другом в ASP.NET Core?

«Как компоненты MVC взаимодействуют друг с другом в ASP.NET Core?» — вопрос из категории ASP.NET Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В ASP.NET Core MVC взаимодействие компонентов происходит через четкий поток данных, управляемый фреймворком. **Стандартный цикл запроса:** 1. **Маршрутизация (Routing):** Входящий HTTP-запрос сопоставляется с действием (`Action`) контроллера на основе шаблонов маршрутов. 2. **Контроллер (Controller):** Выбранное действие контроллера выполняется. Его задачи: * Получить входные данные (из параметров запроса, тела, маршрута). * Вызвать методы **моделей (Model)** (сервисы бизнес-логики, репозитории данных). * Получить результат от моделей. * Определить, какой **вид (View)** вернуть, и передать ему данные. 3. **Модель (Model):** Это не один класс, а слой, содержащий: * **Модели домена (Domain Models):** Объекты бизнес-логики. * **Модели представления (ViewModels):** Объекты, оптимизированные для передачи данных в представление. * **Сервисы и репозитории:** Классы, реализующие бизнес-правила и доступ к данным. Контроллер взаимодействует с этим слоем, но модель не знает о контроллере или представлении. 4. **Представление (View):** Получает от контроллера объект модели (ViewModel). На его основе генерирует HTML-разметку. Представление знает только о данных, которые ему передали, и не должно содержать бизнес-логику. 5. **Ответ:** Сгенерированный HTML возвращается браузеру. **Пример кода, иллюстрирующий поток:** ```csharp // Model (ViewModel для передачи во View) public class ProductViewModel { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } } // Controller public class ProductController : Controller { private readonly IProductService _productService; // Зависимость от слоя Model public ProductController(IProductService productService) { _productService = productService; } // Action public IActionResult Details(int id) { // 1. Взаимодействие с Model (бизнес-слой) var product = _productService.GetProductById(id); if (product == null) return NotFound(); // 2. Подготовка ViewModel var viewModel = new ProductViewModel { Id = product.Id, Name = product.Name, Price = product.Price }; // 3. Передача данных во View и выбор представления return View(viewModel); // Ищет View /Views/Product/Details.cshtml } } ``` ```html @model ProductViewModel

@Model.Name

Price: @Model.Price.ToString("C")

``` **Ключевое:** Контроллер — это "дирижер". Он получает запрос, координирует работу с бизнес-логикой (Model) и передает результат в подходящее представление (View). Модель и Представление не общаются напрямую.