首页 文章

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

提问于
浏览
17

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

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

2 回答

  • 24

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

    它目前不支持MVC4 Web API,但将来会添加支持 . 发生这种情况时,会更新The integration guide .


    UPDATEWeb 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);
    
  • 3

    简短的回答是:是的,它有效 . 下面是适用于我的项目的代码片段,包括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<InterfaceName>()
    

相关问题