2013-08-26 75 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; 
    } 

    ... 
} 
相關問題