Содержание
Несмотря на то, что данные, отображаемые представлениями, должна передаваться от контроллера, всё же 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
. При внедрении зависимостей в представление стоит придерживаться разделения обязанностей — большинство данных в представление должно передаваться из контроллеров и внедрение зависимостей в представление стоит использовать в исключительных случаях.