【问题标题】:Cannot Inject Dependencies into Asp.net MVC 4 Web API Controller using Windsor Container无法使用 Windsor 容器将依赖项注入 Asp.net MVC 4 Web API 控制器
【发布时间】:2012-09-15 13:16:52
【问题描述】:

我无法使用 asp.net web api 配置 Windsor Container,尽管它与常规控制器 (IController) 一起工作正常。

我在同一个项目中有常规控制器和 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,它永远不会被执行。

您的帮助将不胜感激

【问题讨论】:

  • 如何将容器注册为依赖解析器?
  • 为什么你自定义 WindsorApiControllerActivator 而我没有看到任何特殊处理?
  • Cuong le: 因为我在 api 控制器中使用了 Nhibernate Session 对象
    public ISession NSession { get;放; } 公共供应商控制器(ISession 会话){ NSession = 会话; } // GET api/ [HttpPost] public IList Search(SearchViewModel model) { IList searchResultViewModels = SearchVenues(model);返回搜索结果视图模型; //返回“你好世界”; }
  • @nemesv:你身边的任何更新
  • 不要将 Windsor 容器注入到您的组件中:stackoverflow.com/questions/4985455/….

标签: asp.net-mvc asp.net-mvc-4 castle-windsor asp.net-web-api ioc-container


【解决方案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);

【讨论】:

    【解决方案2】:

    您应该非常小心地使用 IDependencyResolver for Windosr w/o decomissiong/release 问题。

    看看这个实现 http://nikosbaxevanis.com/2012/06/04/using-the-web-api-dependency-resolver-with-castle-windsor-part-2/ 我还没有尝试过,但它似乎是当前 webapi 版本的方法

    【讨论】:

      猜你喜欢
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多