Ответ 1
Я хотел бы дать вам предложение и объяснение, почему бы не пойти этим путем и как сделать это по-другому (я бы сказал лучше и правильно).
Полное и полное объяснение несоответствующего дизайна IDependencyResolver
можно найти здесь: Включение в зависимость и управление жизненным циклом с помощью веб-API ASP.NET Марк Семанн
Позвольте мне привести эти существенные части:
Проблема с IDependencyResolver
Основная проблема с
IDependencyResolver
заключается в том, что она по существу является локатором сервисов. Есть много проблем с Locator anti-pattern, но большинство из них я уже описал в другом месте этого блога (и в моей книге). Один из недостатков Service Locator, о котором я еще не писал, заключается в том, что в каждом вызове GetService нет никакого контекста. Это общая проблема с анти-шаблоном Service Locator, а не только с IDependencyResolver.
А также:
... граф зависимости должен знать что-то о контексте. Каков был URL-адрес запроса? Каков был базовый адрес (имя хоста и т.д.)? Как вы можете обмениваться экземплярами зависимостей в рамках одного запроса? Чтобы ответить на такие вопросы, вы должны знать об этом контексте, а IDependencyResolver не предоставляет эту информацию.
Короче говоря,
IDependencyResolver
не подходит для составления графиков зависимостей. ** К счастью, ASP.NET Web API имеет лучшую точку расширения для этой цели. **
ServiceActivator
Итак, ответом в этом случае будет ServiceActivator
. Пожалуйста, взгляните на этот ответ:
Пример ServiceActivator
:
public class ServiceActivator : IHttpControllerActivator
{
public ServiceActivator(HttpConfiguration configuration) {}
public IHttpController Create(HttpRequestMessage request
, HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
var controller = ObjectFactory.GetInstance(controllerType) as IHttpController;
return controller;
}
}
Все, что мы можем сделать с StructureMap, на месте. Основные возможности платформы Web API все еще существуют... нам не нужно их взломать. И мы также скорее используем DI/IoC, затем локатор обслуживания