Передача зависимостей в контроллер

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

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

Как и любой класс, контроллер может получать сервисы приложения через механизм dependency injection. В контроллере это можно делать следующими способами:

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

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

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

Например, пусть в проекте определен интерфейс ITimeService и его реализация SimpleTimeService:

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

И в классе Startup происходит регистрация сервиса ITimeService:

public void ConfigureServices(IServiceCollection services)
{
	services.AddTransient<ITimeService, SimpleTimeService>();
	services.AddControllersWithViews();
}

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

Когда приходит запрос к контроллеру, инфраструктура MVC вызывает провайдер сервисов для создания объекта HomeController. Провайдер сервисов проверят конструктор класса HomeController на наличие зависимостей. Затем создает объекты для всех используемых зависимостей и передает их в конструкторо HomeController для создания объекта контроллера, который затем обрабатывает запрос.

Например, получим зависимость в конструкторе контроллера:

public class HomeController : Controller
{
	private readonly ITimeService _timeService;

	public HomeController(ITimeService timeServ)
	{
		_timeService = timeServ;
	}
	public string Index()
	{
		return _timeService.Time;
	}
}

В данном случае процесс установки зависимостей будет выглядеть следующим образом:

  1. Приложение получает запрос к методу контроллера HomeController

  2. Фреймворк MVC обращается к провайдеру сервисов для создания объекта контроллера HomeController

  3. Провайдер сервисов смотрит на конструктор класса HomeController и видит, что там имеется зависимость от интерфейса ITimeService

  4. Провайдер сервисов среди зарегистрированных зависимостей ищет класс, который представляет реализацию интерфейса ITimeService

  5. Если нужная зависимость найдена, то провайдер сервисов создает объект класса, который реализует интерфейс ITimeService

  6. Затем провайдер сервисов создает объект HomeController, передавая в его конструктор ранее созданную реализацию ITimeService

  7. В конце провайдер сервисов возвращает созданный объект HomeController инфраструктуре MVC, которая использует контроллер для обработки запроса

Передача зависимостей в методы. FromServices

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

public string Index([FromServices] ITimeService timeService)
{
	return timeService.Time;
}

Атрибут FromServices предоставляется инфраструктурой MVC - он определен в пространстве имен Microsoft.AspNetCore.Mvc.

HttpContext.RequestServices

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

using Microsoft.Extensions.DependencyInjection;
//........................................

public string Index()
{
	ITimeService timeService = HttpContext.RequestServices.GetService<ITimeService>();
	return timeService?.Time;
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850