2017-05-25 76 views
2

我手动registrering我的项目的Web API控制器的一个子集:注册子集,用简单的注射器

container.Register(typeof(ILGTWebApiController), controllerType, Lifestyle.Transient); 

工作正常。然而,当我运行:

GlobalConfiguration.Configuration.DependencyResolver = 
    new SimpleInjectorWebApiDependencyResolver(container); 

这似乎影响项目中的所有的Web API控制器。我想通过简单的喷油器保持其他部分不变。

如果我不跑上面的代码,简单的喷油器会抱怨没有一个空的构造(他们显然不会,因为我使用DI)我的控制器。

回答

1

,而不是替换IDependencyResolver的,创建一个自定义IHttpControllerActivator解析控制器或回退到原激活剂,否则:

public sealed class MyControllerActivator : IHttpControllerActivator 
{ 
    private readonly Container container; 
    private readonly IHttpControllerActivator original; 

    public MyControllerActivator(Container container, IHttpControllerActivator original) 
    { 
     this.container = container; 
     this.original = original; 
    } 

    public IHttpController Create(
     HttpRequestMessage req, HttpControllerDescriptor desc, Type type) 
    { 
     if (type == typeof(ILGTWebApiController)) 
      return (IHttpController)this.container.GetInstance(type); 

     return this.original.Create(req, desc, type); 
    } 
} 

您可以配置您的自定义MyControllerActivator如下:

GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), 
    new MyControllerActivator(
     container, 
     GlobalConfiguration.Configuration.Services.GetHttpControllerActivator())); 
+0

谢谢史蒂芬,似乎工作正常:)后续问题,如果你有时间:当使用这种解决方案,是否有任何相应的选项'GlobalConfiguration.Configuration.DependencyResolver.GetService'? – Johan

+0

我问的原因是因为我在属性类中使用了该片段。我想解决这个问题的一种方法是全局暴露'容器',以便可以从属性中访问它。像这样暴露容器被认为是不好的做法吗?我想一个缺点是它不能100%验证? – Johan

+0

对不起,你想做什么?你在一个属性中做什么,为什么? – Steven