我有一个MVC项目,该项目利用控制器中的DI模式,并使用Unity来解决我的依赖项。
我最近介绍了WebApi软件包,它是在引入了令人讨厌的错误之后。
当我尝试将服务类注入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模式
我将此服务注入了其他控制器(源自MVC“ BaseController”而不是WebApi“ ApiController”)
MVC控制器和APi控制器处理DI的方式是否有所不同?
答案 0 :(得分:1)
似乎您的Dependency Resolver没有为WebAPI设置。如果您从使用控制器转移到WebApi控制器,则DependencyResolver是不同的。对于您的常规MVC控制器,您可能一直在进行类似于Name :Student, LastID : 50001
的调用,但是WebApi控制器的DI需要将其依赖项解析器设置为HttpConfiguration,类似于Update Sequence
set LastID = Case when LastID + @range >= @max then 0 else LastID end
where Name ='StudentID'
例如,在某些项目中,我使用SimpleInjector(想法应该相同)-
MVC DI配置:
DependencyResolver.SetResolver()
WebAPI配置:
httpConfiguration.DependencyResolver =
请注意,这些调用都在同一项目中,在同一项目中我们拥有MVC控制器和WebApi。