2013-08-26 49 views
1

我在我的MVC网站的区域中有一个ApiController,我通过Unity向它注入依赖关系,并且我的控制器扩展了System.Web.Http.ApiController。当ApiController还需要一个空的构造函数时使用依赖注入?

我从Microsoft.Practices.Unity.dll,v3.0.0.0使用Unity。

我可以路由与控制器ApiAreaRegistration

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

以下,但我得到了以下错误:

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

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

我开始觉得我失去了一些结构?

+1

'MapRoute'与您的Unity问题无关。你的控制器是否扩展了'System.Web.Http.ApiController'?你在使用Unity.WebApi包吗? – Jasen

+0

@Jasen,谢谢我将细节添加到我原来的问题中。 –

+0

您知道,与MVC相比,WebApi存在单独的依赖项解析器注册,对吗? –

回答

2
GlobalConfiguration.Configuration.DependencyResolver = 
     new UnityDependencyResolver(YOUR_UNITY_CONTAINER); 

http://msdn.microsoft.com/en-us/library/dn178463(v=pandp.30).aspx#sec18,你可以发现你要搜索“团结引导程序用于ASP.NET的WebAPI”,你从命名空间中得到UnityDependencyResolver:“Microsoft.Practices.Unity.WebApi”。

最简单的方法就是安装WebApi引导程序并查看App_Start文件夹。

1

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

我使用Unity.WebAPI NuGet包来管理控制器的建立和容器的生命周期管理。如果您的项目也使用MVC控制器,则Unity.Mvc3将处理这些控制器。这些软件包通过很少的代码就可以为我的控制器提供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; 
    } 

    ... 
} 
相关问题