Simple 注入器 IOC 是否支持 MVC 4 ASP.NET Web API?
目前不支持 MVC4 Web API,但未来会增加支持。 The integration guide 将在发生这种情况时更新。
更新:Web API support 已添加到 Simple Injector 2.5。
与此同时,您可以为 Simple Injector 创建自己的 System.Web.Http.Dependencies.IDependencyResolver 实现。下面是在 IIS 托管环境中使用 Web API 的实现:
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 托管环境中实现范围(其中请求可能在与其开始位置不同的线程上结束)。
Because of the way Web API is designed,显式注册所有 Web 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);