1

我在 MVC 网站的某个区域中有一个 ApiController,我通过 Unity 将依赖项注入其中,并且我的控制器扩展了 System.Web.Http.ApiController。

我正在使用来自 Microsoft.Practices.Unity.dll,v3.0.0.0 的 Unity。

我可以在 ApiAreaRegistration 中使用以下内容路由到控制器

context.MapRoute(
    "Api_default",
    "Api/users/{action}/{id}"
);

但我收到以下错误:

类型“Project.Areas.Api.Controllers.UsersController”没有默认构造函数

但是,如果我添加一个默认构造函数,我的依赖项不会得到解决。

我开始觉得我缺少一些结构性的东西?

4

2 回答 2

3

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

我使用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;
    }

    ...
}
于 2013-08-27T18:47:55.587 回答
2
    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',你会得到命名空间中的 UnityDependencyResolver:“Microsoft.Practices.Unity.WebApi”。

最简单的方法就是安装 WebApi Bootstrapper 并查看 App_Start 文件夹。

于 2013-09-02T20:16:03.113 回答