2017-05-25 78 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