Почему MVC4 использует Anti-Pattern Locator? - программирование
Подтвердить что ты не робот

Почему MVC4 использует Anti-Pattern Locator?

После прочтения "Инъекция зависимостей в .NET" от Mark Seemann Я держусь подальше от "Локатор сервисов" , который является анти-шаблоном.

После чтения примечаний к выпуску на MVC 4 Я вижу:

Улучшенная инверсия управления (IoC) через DependencyResolver: веб-API теперь использует шаблон локатора службы, реализованный зависимостью MVCs resolver для получения экземпляров для многих различных объектов.

Таким образом, мне остается любопытно и смущать, почему Microsoft будет использовать локатор сервисов в 2012 году.

4b9b3361

Ответ 1

Это деталь реализации, которой вы не должны заботиться. Важно то, что теперь, когда веб-API использует DependencyResolver для разрешения зависимостей для многих различных объектов, вы сможете использовать реальную инъекцию зависимостей, когда хотите подключиться к этим средствам. Таким образом, в вашем коде вы будете использовать реальную инъекцию зависимостей. Если Microsoft не использовала DependencyResolver, то вы должны были использовать ее (как антивирус) в своем коде, чтобы разрешать зависимости, когда вы хотите реализовать некоторые пользовательские функции. Это было бы плохо для вас. Теперь это плохо для Microsoft, но вы не заботитесь о них.

Таким образом, мне остается любопытно и смущать, почему Microsoft будет использовать локатор сервисов в 2012 году.

Потому что разработка структуры - это не то же самое, что проектирование приложения с использованием фреймворка. При разработке многоразовой структуры, такой как ASP.NET MVC, необходимо учитывать некоторые разные вещи, а не только то, что написано в книгах. Некоторым примером является разработка структуры таким образом, что человек, использующий эту структуру, сможет использовать лучшие практики, написанные в книгах в своем коде, используя эту инфраструктуру.

Ответ 2

Как указывает Дарин, ASP.NET MVC 4 является Framework и является агностиком контейнера. Поэтому он предоставляет локатор службы в виде IDependencyResolver. Это позволяет любому подключить свой контейнер по выбору.

Однако я бы не назвал это анти-шаблоном. Это позволяет использовать контейнер по вашему выбору, но он не заставляет вы разработчика приложения использовать местоположение службы. Если структура заставила разработчика использовать Service Location, я бы назвал его анти-шаблоном. Но разработчик, который создает приложение ASP.NET MVC, может свободно использовать DI через инсталляцию конструктора, настройку свойств или местоположение службы. Это их выбор.

Посмотрите все примеры внедрения MVC MVC MVC, опубликованные мной или командой ASP.NET MVC. В почти всех случаях они используют инъекцию конструктора. Они не используют местоположение службы.

Фактически, большая часть исходного кода ASP.NET MVC сама по себе не использует местоположение службы для извлечения зависимостей. Там несколько ключевых мест, где MVC вызывает локатор сервисов для устаревших API и т.д. Но об этом.