Как и любой класс, Страница 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>
Иногда зависимость используется только в одном методе. И в этом случае нет необходимости передавать ее в конструктор, поскольку она напрямую может быть внедрена в сам метод, который ее использует. Для передачи зависимости в метод применяется атрибут [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, а через свойство 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}"; } } }
На самой странице Razor также можно получать сервисы с помощью директивы @inject. Например, изменим код страницы Index.cshtml:
@page @inject ITimeService timeService <h2>Current Time: @timeService.Time</h2>
Директива @inject принимает два параметра: первый параметр представляет тип сервиса (в данном случае ITimeService), а второй - название переменной этого типа (в данном случае timeService).