当ApiController还需要一个空构造函数时,使用依赖项注入
本文关键字:构造函数 注入 依赖 一个 ApiController | 更新日期: 2023-09-27 18:29:03
我在MVC网站的一个区域中有一个ApiController,我通过Unity将依赖项注入其中,我的控制器扩展了System.Web.Http.ApiController.
我使用的是Microsoft.Practices.Unity.dll 3.0.0.0版本中的Unity。
我可以在ApiAreaRegistration 中使用以下内容路由到控制器
context.MapRoute(
"Api_default",
"Api/users/{action}/{id}"
);
但我得到以下错误:
类型"Project.Areas.Api.Controllers.UsersController"没有默认构造函数
然而,如果我添加一个默认构造函数,我的依赖关系就不会得到解决。
我开始觉得我错过了一些结构性的东西?
您没有显示控制器注册,错误消息表明您没有注册控制器依赖项。
我使用Unity.WebAPI NuGet包来处理控制器构建和容器寿命管理。如果您的项目也使用MVC控制器,Unity.Mvc3将处理这些控制器。这些包让Unity为我的控制器连接起来,只需很少的代码。
我的Unity引导程序看起来像这个
public static class UnityConfig
{
var container = BuildUnityContainer();
// MVC controllers
DependencyResolver.SetResolver(new Unity.Mvc3.UnityDependencyResolver(container));
// WebAPI controllers
GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);
}
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
// register all your components with the container here
// you don't need to register controllers
container.RegisterType<IUsersService, UsersService>();
...
return container;
}
我不担心我的控制器的创建--它只是起作用。
public class UsersController : ApiController
{
private IUsersService service;
public UsersController(IUsersService service)
{
this.service = service;
}
...
}
GlobalConfiguration.Configuration.DependencyResolver =
new UnityDependencyResolver(YOUR_UNITY_CONTAINER);
和来自http://msdn.microsoft.com/en-us/library/dn178463(v=pandp.30).aspx#sec18您可以发现,您应该搜索"Unity bootstrapper for ASP.NET WebApi",并从命名空间"Microsoft.Practices.Unity.WebApi"."中获得UnityDependencyResolver
最简单的方法就是安装WebApi引导程序并查看App_Start文件夹。