Asp.net web api 依赖注入破坏了我的WebApi控制器

Asp.net web api 依赖注入破坏了我的WebApi控制器,asp.net-web-api,model-view-controller,dependency-injection,Asp.net Web Api,Model View Controller,Dependency Injection,我有一个MVC项目,在我的控制器中使用DI模式,使用Unity解决依赖关系 我最近介绍了WebApi包,它是在引入了一个恼人的bug之后推出的 当我尝试将服务类注入web api控制器时,出现以下错误: “尝试创建“TestController”类型的控制器时出错。请确保该控制器具有无参数公共构造函数。” 这是密码 public class TestController : ApiController { private readonly IBrokerService _brokerAc

我有一个MVC项目,在我的控制器中使用DI模式,使用Unity解决依赖关系

我最近介绍了WebApi包,它是在引入了一个恼人的bug之后推出的

当我尝试将服务类注入web api控制器时,出现以下错误:

“尝试创建“TestController”类型的控制器时出错。请确保该控制器具有无参数公共构造函数。”

这是密码

public class TestController : ApiController
{
    private readonly IBrokerService _brokerAccessService;
    public TestController(IBrokerService brokerAccessService)
    {
        _brokerAccessService = brokerAccessService;
    }

    /// Controller methods here

}
我可以像这样添加一个无参数构造函数,效果很好

        public TestController()
    {
        _brokerAccessService = new BrokerService(new BrokerRepository(new ForexRebatesNowEntities()));
    }
但这完全违反了DI模式

我已将此服务注入其他控制器(从MVCs“BaseController”而不是WebApi“ApiController”派生),并且没有任何问题


MVC控制器和APi控制器处理DI的方式有区别吗?

看起来您的依赖项解析器没有为WebAPI设置。如果从使用控制器转移到使用WebApi控制器,DependencyResolver就不同了。对于常规MVC控制器,您可能已经进行了类似于
DependencyResolver.SetResolver()
的调用,但是DI For WebApi控制器需要将其依赖项解析器设置为HttpConfiguration,类似于
HttpConfiguration.DependencyResolver=

例如,在一些项目中,我使用SimpleInjector(想法应该是一样的)-

MVC DI配置:

DependencyResolver.SetResolver(新的SimpleInjector DependencyResolver(mvcContainer))

WebAPI配置:

httpConfiguration.DependencyResolver=新的SimpleInjectorWebApidencyResolver(apiContainer)


作为旁注-这些调用都在同一个项目中,我们在同一个解决方案中有MVC控制器和WebApi。

您是否在全局HttpConfiguration对象的DependencyResolver属性上设置了依赖项解析程序

public static void Register(HttpConfiguration config)
{
  var container = new UnityContainer();
  container.RegisterType<IBrokerService, BrokerService>(new              
                    HierarchicalLifetimeManager());;
  config.DependencyResolver = new UnityResolver(container);
}

它将是这样的-依赖项解析程序不适合创建带有参数的控制器。重复?复制品?
    public static class UnityConfig
{
    public static void RegisterComponents()
    {
        var container = new UnityContainer();

        // register all your components with the container here
        // it is NOT necessary to register your controllers

        // e.g. container.RegisterType<ITestService, TestService>();
        container.RegisterType<IBrokerService, BrokerService>();
        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    }
}
     protected void Application_Start()
    {
        //Register your unity configuration
        UnityConfig.RegisterComponents();            
    }