Передача зависимостей на страницу

Последнее обновление: 17.04.2022

Как и любой класс, Страница Razor и ее модель могут получать сервисы приложения через встроенный в ASP.NET Core механизм dependency injection. Это можно делать следующими способами:

  • Через конструктор

  • Через параметр метода, к которому применяется атрибут FromServices

  • Через свойство HttpContext.RequestServices

  • С помощью директивы @inject

Например, пусть у нас есть следующий файл Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
// добавляем сервис ITimeService
builder.Services.AddTransient<ITimeService, SimpleTimeService>();

var app = builder.Build();

app.MapRazorPages();  

app.Run();

public interface ITimeService
{
    string Time { get; }
}
public class SimpleTimeService : ITimeService
{
    public string Time => DateTime.Now.ToString("HH:mm:ss");
}

В данном случае определен интерфейс ITimeService и его реализация SimpleTimeService. И в приложении происходит регистрация сервиса ITimeService.

Передача через конструктор

Получим зависимость в конструкторе модели IndexModel:

using Microsoft.AspNetCore.Mvc.RazorPages;

namespace RazorPagesApp.Pages
{
    public class IndexModel : PageModel
    {
        public string Message { get; private set; }
        public IndexModel(ITimeService timeService)
        {
            Message = $"Time: {timeService.Time}";
        }
    }
}

Выведем значение свойства Message модели на странице Index.cshtml:

@page 

@model RazorPagesApp.Pages.IndexModel
<h2>@Model.Message</h2>
Передача зависимостей на страницу Razor Pages в ASP.NET Core и C#

Передача зависимостей в методы с помощью атрибута FromServices

Иногда зависимость используется только в одном методе. И в этом случае нет необходимости передавать ее в конструктор, поскольку она напрямую может быть внедрена в сам метод, который ее использует. Для передачи зависимости в метод применяется атрибут [FromServices]:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace RazorPagesApp.Pages
{
    public class IndexModel : PageModel
    {
        public string Message { get; private set; } = "";
        public void OnGet([FromServices] ITimeService timeService)
        {
            Message = $"Time: {timeService.Time}";
        }
    }
}

Атрибут FromServices определен в пространстве имен Microsoft.AspNetCore.Mvc.

HttpContext.RequestServices

На странице и в методах модели можно обращаться к объекту контекста запроса через свойство HttpContext, а через свойство HttpContext.RequestServices можно получить все зарегистрированные в приложении сервисы:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace RazorPagesApp.Pages
{
    public class IndexModel : PageModel
    {
        public string Message { get; private set; } = "";
        public void OnGet()
        {
            ITimeService? timeService = HttpContext.RequestServices.GetService<ITimeService>();
            Message = $"Time: {timeService?.Time}";
        }
    }
}

Директива @inject

На самой странице Razor также можно получать сервисы с помощью директивы @inject. Например, изменим код страницы Index.cshtml:

@page 

@inject ITimeService timeService
<h2>Current Time: @timeService.Time</h2>

Директива @inject принимает два параметра: первый параметр представляет тип сервиса (в данном случае ITimeService), а второй - название переменной этого типа (в данном случае timeService).

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850