Я читаю через ASP.NET 5 docs и задыхаюсь от главы инъекции зависимостей.ASP.NET 5/Core 1 Инъекция зависимостей: плохой дизайн или плохая документация?
Я рекомендовал писать свои контроллеры так:
public class MyController: Controller
{
private readonly MyService _myService;
public MyController(MyService myService)
{
_myService = myService;
}
public IActionResult Index()
{
// use _myService
}
}
Короткий и прямой вариант не рекомендуется:
public class MyController : Controller
{
public IActionResult Index()
{
var myService = (MyService)HttpContext.RequestServices.GetService(typeof(MyService));
}
}
The given reason потому, что якобы рекомендуемая версия ...
[...] дает классы, которые легче тестировать (см. Тестирование) и более слабо связаны.
Связанная глава тестирования не проливает свет на эту странную инструкцию.
Я не смотрел на источники, но я предполагаю, какие конструкции контроллер использует HttpContext.RequestServices.GetService
для доставки зависимости? Очевидно, что тест может настроить различную реализацию для тестирования и, очевидно, , что - это вся суть рамки DI, правильно?
Колос (MyService)HttpContext.RequestServices.GetService(typeof(MyService))
достаточно плох, но маленький помощник может исправить это (было очень просто Get<MyService>()
).
Но этот чрезмерный беспорядок рекомендуется для практически каждого контроллера и более беспокоит.
Это тем более непонятно, как там уже есть основа Microsoft DI с правильным использованием, MEF:
public class MyController : Controller
{
[Import]
private MyService _myService;
public IActionResult Index()
{
// use _myService
}
}
Почему хотя бы не просто принять, что один? Что тут происходит?
Не подходит тип вопроса на SO. Перед публикацией прочитайте FAQ/справочный центр. Основополагающие мнения не являются правильным типом вопроса для SO. Просто предложение для вашего «вопроса»: ваша версия скрывает зависимости, и во время модульного теста невозможно узнать, какие зависимости у класса есть, тогда как конструктор, который вы видите, плюс ваши типы, зависит от конкретного контейнера, тогда как конструктор этого не делает. – Tseng
Это просто плохая документация :) – Steven