2013-04-21 64 views
8

我的ASP.Net MVC 4 Web API控制器不能与Unity.WebApi一起使用。在同一个项目中,简单的控制器可以正确使用Unity.Mvc3。但是,当我运行从ApiController衍生我得到一个消息的Web API控制器:ASP.Net MVC 4 Web API控制器不能使用Unity.WebApi

{ “的$ id”: “1”, “消息”: “发生错误”, “ExceptionMessage”:”类型 'ElectricTests.Controllers.Api.DocumentsController'没有 默认 构造函数“,”ExceptionType“:”System.ArgumentException“,”StackTrace“:” at System.Linq.Expressions.Expression.New(Type type个)\ r \ n在 System.Web.Http.Internal.TypeActivator.Create [TBASE](类型 instanceType个)\ r \ n在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage 请求,控制器类型型,Func`1 &活化剂)\ r \ n在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor controllerDescriptor,类型 controllerType)“}

我ApiController:

public class DocumentsController : ApiController 
{ 
    private readonly IDocumentsRepository _repository; 

    public DocumentsController(IDocumentsRepository repository) { 
     _repository = repository; 
    } 

    public IEnumerable<FormattedDocument> GetFormattedDocuments() 
    { 
     return _repository.GetAllFormattedDocuments(); 
    } 
    ... 

Bootstrapper.cs:

public static class Bootstrapper { 
    public static void Initialise() { 
     IUnityContainer container = BuildUnityContainer(); 
     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
    } 

    private static IUnityContainer BuildUnityContainer() { 
     var container = new UnityContainer(); 

     // register all your components with the container here 
     // it is NOT necessary to register your controllers 
     // e.g. container.RegisterType<ITestService, TestService>();    

     container.RegisterType<IDocumentsRepository, DocumentsRepository>(); 
     container.RegisterType<IQuestionsRepository, QuestionsRepository>(); 
     container.RegisterType<ITestRepository, TestsRepository>(); 

     return container; 
    } 
} 

哪里是我的错?

+0

异常文本:DocumentsController没有默认构造函数 – 2013-04-21 14:45:02

+0

本文解决的这个问题: http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency -resolver – Oblomingo 2013-04-22 06:18:00

回答

25

控制器和ApiController的处理是不同的,因为它们具有完全不同的基类:

我使用Unity.MVC4库控制器DI(http://www.nuget.org/packages/Unity.MVC4/

Install-Package Unity.MVC4 

和Unity.WebAPI的DI(http://www.nuget.org/packages/Unity.WebAPI/

Install-Package Unity.WebAPI 

你的引导程序应该是两者的结合:

DependencyResolver.SetResolver(new Unity.Mvc4.UnityDependencyResolver(container)); 
GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container); 

注意我也不得不做一些补充注册以获得帮助页面的工作

container.RegisterInstance(typeof (HttpConfiguration), GlobalConfiguration.Configuration); 

作为Unity.MVC4的所有者,我正在研究如何让WebApi在我们的库中实现。

+0

这个答案解决了我的Unity和WebApi控制器问题,谢谢@Oliver。 – Jenan 2015-08-08 14:59:02

0

当您安装了统一的ASP.NET Web API,它除了下面的行添加到您的Global.asax一切

Bootstrapper.Initialise(); 

所以,你需要的是添加到您的Application_Start方法:

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    Bootstrapper.Initialise(); 

    WebApiConfig.Register(GlobalConfiguration.Configuration); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
}