当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"没有默认构造函数

然而,如果我添加一个默认构造函数,我的依赖关系就不会得到解决。

我开始觉得我错过了一些结构性的东西?

当ApiController还需要一个空构造函数时,使用依赖项注入

您没有显示控制器注册,错误消息表明您没有注册控制器依赖项。

我使用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文件夹。