5

通常のコントローラ(IController)でうまく動作しますが、Windsor Containerをasp.net web apiで設定できません。Windsorコンテナを使用してAsp.net MVC 4 Web APIコントローラに依存関係を挿入できません

私は同じプロジェクト内に通常のコントローラとAPIコントローラを持っています。ここ

は細かい作業正規コントローラ用のコードである:

/// <summary> 
    /// Controller Factory class for instantiating controllers using the Windsor IoC container. 
    /// </summary> 
    public class WindsorControllerActivator : IControllerActivator 
    { 
     private readonly IWindsorContainer container; 
     public WindsorControllerActivator(IWindsorContainer container) 
     { 
      this.container = container; 
     } 
     public IController Create(RequestContext requestContext, Type controllerType) 
     { 
      var controller = (IController)container.GetService(controllerType); 
      return controller; 
     } 

} 

とglobal.asax.cs

container.Register(Component.For<IWindsorContainer>().Instance(container)); 
    container.Register(Component.For<IControllerActivator>().ImplementedBy<WindsorControllerActivator>()); 

以下では、問題のコードである:

public class WindsorApiControllerActivator : IHttpControllerActivator 
    { 
     private readonly IWindsorContainer container; 
     public WindsorApiControllerActivator(IWindsorContainer container) 
     { 
      this.container = container; 
     } 
     public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
     { 
      var controller = (IHttpController)container.GetService(controllerType); 
      return controller; 
     } 
    } 

インストーラ:

container.Register(Component.For<IHttpControllerActivator>().ImplementedBy<WindsorApiControllerActivator>()); 

しかし、WindsorApiControllerActivatorを実行することはできません。

私は、WindsorControllerActivatorにデバッガを置くと期待通りに動作しますが、WindsorApiControllerActivatorでは決して実行されません。

あなたの助けが

+0

コンテナを依存関係リゾルバーとしてどのように登録しますか? – nemesv

+0

WindsorApiControllerActivatorをカスタマイズする理由は何ですか?特別な扱いはありませんか? –

+0

Cuong le:apiコントローラでNhibernate Sessionオブジェクトを使用しているため、
公開ISession NSession {get;セット; } 公開VendorController(セッションセッション) { NSession =セッション; } // GET API/ [HttpPost] 公共のIList 検索(SearchViewModelモデル) { のIList searchResultViewModels = SearchVenues(モデル)。return searchResultViewModels; // "Hello World"を返します。 } –

答えて

1

を理解されるであろう、私はglobal.asax.csに次のコードを追加し、それが動作します:)

_windsorContainer = new WindsorContainer(); 
    _windsorContainer.Install(new EventSorbetInstaller()); 
    DependencyResolver.SetResolver(new WindsorDependencyResolver(_windsorContainer)); 
    ServiceLocator.SetLocatorProvider(() => new WindsorServiceLocator(_windsorContainer)); 
    RegisterFilterProviders(FilterProviders.Providers, _windsorContainer); 

    var activator = _windsorContainer.Resolve<IHttpControllerActivator>(); 

    GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), activator); 
関連する問題