Asp.net web api 依赖注入破坏了我的WebApi控制器
我有一个MVC项目,在我的控制器中使用DI模式,使用Unity解决依赖关系 我最近介绍了WebApi包,它是在引入了一个恼人的bug之后推出的 当我尝试将服务类注入web api控制器时,出现以下错误: “尝试创建“TestController”类型的控制器时出错。请确保该控制器具有无参数公共构造函数。” 这是密码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
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();
}