Ответ 1
Поддерживает ли простой инжектор IOC MVC 4 ASP.NET Web API?
В настоящее время он не поддерживает веб-API MVC4, но поддержка будет добавлена в будущем. Руководство по интеграции будет обновлено, когда это произойдет.
UPDATE: Поддержка веб-API добавлена в Simple Injector 2.5.
Тем временем вы можете создать свою собственную реализацию System.Web.Http.Dependencies.IDependencyResolver
для простого инжектора. Ниже приведена реализация для работы с веб-API в среде размещения IIS:
public class SimpleInjectorHttpDependencyResolver :
System.Web.Http.Dependencies.IDependencyResolver
{
private readonly Container container;
public SimpleInjectorHttpDependencyResolver(
Container container)
{
this.container = container;
}
public System.Web.Http.Dependencies.IDependencyScope
BeginScope()
{
return this;
}
public object GetService(Type serviceType)
{
IServiceProvider provider = this.container;
return provider.GetService(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
IServiceProvider provider = this.container;
Type collectionType = typeof(IEnumerable<>).MakeGenericType(serviceType);
var services =(IEnumerable<object>)this.ServiceProvider.GetService(collectionType);
return services ?? Enumerable.Empty<object>();
}
public void Dispose()
{
}
}
В этой реализации не используется область охвата, так как вам нужно использовать Per Web Api Request для реализации области видимости внутри веб-хостинга (где запрос может закончиться в другом потоке, чем там, где он был запущен).
Из-за того, как разработан Web API, очень важно явно зарегистрировать все контроллеры веб-API. Вы можете сделать это, используя следующий код:
var services = GlobalConfiguration.Configuration.Services;
var controllerTypes = services.GetHttpControllerTypeResolver()
.GetControllerTypes(services.GetAssembliesResolver());
foreach (var controllerType in controllerTypes)
{
container.Register(controllerType);
}
Вы можете зарегистрировать SimpleInjectorHttpDependencyResolver
следующим образом:
// NOTE: Do this as last step, after registering the controllers.
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorHttpDependencyResolver(container);