5

通常のコントローラー(IController)では正常に機能しますが、asp.netWebAPIを使用してWindsorContainerを構成できません。

同じプロジェクトに通常のコントローラーと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の場合は実行されません。

あなたの助けをいただければ幸いです

4

2 に答える 2

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);
于 2012-09-24T05:37:54.433 に答える
0

WindosrにIDependencyResolverを使用する場合は、デコミッション/リリースの懸念がないように十分に注意する必要があります。

この実装を ご覧くださいhttp://nikosbaxevanis.com/2012/06/04/using-the-web-api-dependency-resolver-with-castle-windsor-part-2/ まだ試していませんが、しかし、それは現在のwebapiリリースで行く方法のようです

于 2012-09-24T09:59:16.643 に答える