Simple Injector是否支持MVC 4 ASP.NET Web API?

我是Simple Injector IOC容器的新手。 我将开始在一个项目中工作,该项目需要使用MVC 4 ASP.NET Web API的多租户ASP.NET MVC实现。

我的问题是:Simple inject支持MVC 4 ASP.NET Web API吗? 阅读这样的简单注入器文档会引用MVC 3,我想知道MVC 4是否也受支持。

Simple injector IOC是否支持MVC 4 ASP.NET Web API?

它目前不支持MVC4 Web API,但将来会添加支持。 发生这种情况时,将更新集成指南 。


更新 :Simple Injector 2.5中添加了Web API支持 。


在此期间,您可以为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 GetServices(Type serviceType) { IServiceProvider provider = this.container; Type collectionType = typeof(IEnumerable<>).MakeGenericType(serviceType); var services =(IEnumerable)this.ServiceProvider.GetService(collectionType); return services ?? Enumerable.Empty(); } public void Dispose() { } } 

此实现不实现作用域,因为您需要使用Per Web Api请求生存期来在Web托管环境中实现作用域(其中请求可能在与其开始的不同的线程上结束)。

由于Web API的设计方式 ,显式注册所有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); 

简短的回答是:是的,它有效。 下面是适用于我的项目的代码片段,包括Web API和MVC4控制器(部分基于上面的Steven响应):

 var container = new Container(); //Register you types in container here container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); container.RegisterMvcAttributeFilterProvider(); var controllerTypes = from type in Assembly.GetExecutingAssembly().GetExportedTypes() where typeof(ApiController).IsAssignableFrom(type) where !type.IsAbstract where !type.IsGenericTypeDefinition where type.Name.EndsWith("Controller", StringComparison.Ordinal) select type; foreach (var controllerType in controllerTypes) { container.Register(controllerType); } container.Verify(); DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); 

要访问API控制器中的类型,您可以使用以下代码段:

 DependencyResolver.Current.GetService()