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
此实现不实现作用域,因为您需要使用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()