Содержание
Несмотря на то, что данные, отображаемые представлениями, должна передаваться от контроллера, всё же ASP.NET Core MVC позволяет внедрять зависимости и в представления. Внедрение зависимостей в представления можно допускать, например, когда информация из сервиса используется непосредственно для отображения данных в представлении.
Директива Razor @inject
Для внедрения зависимости в представление ASP.NET Core MVC используется директива Razor @inject. Допустим, нам необходимо, чтобы на главной странице нашего приложения выводилось текущее время. Напишем следующий сервис:
namespace AspViews
{
public interface ITimeService
{
public string GetTime();
}
public class TimeService: ITimeService
{
public string GetTime()
{
return DateTime.Now.ToLongTimeString();
}
}
}
Зарегистрируем сервис в контейнере зависимостей:
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.AddTransient<ITimeService, TimeService>();
....
Теперь внедрим этот сервис в представление View/Home/Index.cshtml следующим образом:
@inject ITimeService timer
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<p>@timer.GetTime()<p/>
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
здесь мы использовали директиву @inject для внедрения зависимости:
@inject ITimeService timer
и вызвали метод GetTime() сервиса на странице:
<p>@timer.GetTime()<p/>
Результат:
Итого
Для внедрения зависимостей в представление используется директива Razor @inject. При внедрении зависимостей в представление стоит придерживаться разделения обязанностей — большинство данных в представление должно передаваться из контроллеров и внедрение зависимостей в представление стоит использовать в исключительных случаях.