【问题标题】:WebAPI + APIController with structureMapWebAPI + APIController 与结构映射
【发布时间】:2013-09-24 15:51:14
【问题描述】:

我正在尝试使用 StructureMap 来初始化派生自 ApiController 的 ValuesController,但我收到一个异常消息:

IControllerFactory '...CustomControllerFactory' 没有返回名称为 'api' 的控制器。

这是代码..

public class CustomControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
            return null;

        return (Controller)ConcretizationsManager.GetInstance(controllerType);
    }
}

基本上 ConcretizationsManager 是 StructureMap 的包装器。 此方法对于 Controller 类型的 Controller 始终可以正常运行,但对于 APIController 则不行。

有人能帮我找到正确的方向吗? 非常感谢

【问题讨论】:

    标签: .net asp.net-web-api structuremap


    【解决方案1】:

    StructureMap 3 对此提供第一方支持

    nuget 安装 Structuremap.WebApi2

    StructureMap 4 已经发布,也可以使用,不过there may be slight tweaks needed。我还没有为自己确认。

    【讨论】:

      【解决方案2】:

      对于 Web API,我使用自定义 ServiceActivator 像这样(即不同的工厂然后用于 MVC):

      public class ServiceActivator : IHttpControllerActivator
      {
          public ServiceActivator(HttpConfiguration configuration) {}    
      
          public IHttpController Create(HttpRequestMessage request
              , HttpControllerDescriptor controllerDescriptor, Type controllerType)
          {
              var controller = Factory.CreateInstance(controllerType) as IHttpController;
              return controller;
          }
      }
      

      Factory 是我的 Sturcturemap API 包装器

      App_Start\WebApiConfig.cs 我确实这样注册:

      config.Services.Replace(typeof(IHttpControllerActivator), new ServiceActivator(config));
      

      【讨论】:

      • Greate ;) 我也很高兴 ;)
      • 在我自己的应用中是ObjectFactory.GetInstance 而不是Factory.CreateInstance
      • 请注意,您是对的。我们使用抽象自定义Factory 及其提供者包装了StructureMap。但也可能如你所说……
      • @Brian 您应该提出自己的问题来回答如何使用容器... 例如,我正在使用自定义 IRegistry MyRegistry : Registry,这是所有设置的地方。然后我可以构建new Container(new MyRegistry()); 甚至更多...
      • 我只需要在 MVC 5.2.2 之上实现 WebApi 5.2.2,所以我只使用了开箱即用的包“StructureMap.WebApi2”。不需要自定义代码。如果您在 MVC 中有 *catch all route,请确保在 MVC 之前注册 WebAPI(路由)。我只是在获得 404 而不是访问 WebAPI 时卡住了一段时间,尽管问题出在 DI 上。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      相关资源
      最近更新 更多