2013-04-21 16 views
8

Mój kontroler ASP.Net MVC 4 Web API nie działa z Unity.WebApi. W tym samym projekcie proste kontrolery działają poprawnie z Unity.Mvc3. Ale kiedy uruchomić kontroler sieci Web API pochodzący z ApiController Dostaję wiadomość:Kontroler ASP.Net MVC 4 Web API nie współpracuje z Unity.WebApi

{ "$ id": "1", "Message": "Wystąpił błąd", "ExceptionMessage":” Typ Parametr "ElectricTests.Controllers.Api.DocumentsController" nie ma domyślnego konstruktora "," ExceptionType ":" System.ArgumentException "," StackTrace ":" w System.Linq.Expressions.Expression.New (typ typu) \ r \ n co System.Web.Http.Internal.TypeActivator.Create [TBase] (typ instancetype) \ r \ n co System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator (HttpRequestMessage żądanie sterownik Typ Typ Func`1 & aktywator) \ r \ n co System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (HttpRequestMessage prośba HttpControllerDescriptor controllerDescriptor, typ controllerType) "}

My 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; 
    } 
} 

gdzie jest mój błąd?

+0

Tekst wyjątku: DocumentsController nie ma domyślnego konstruktora. –

+0

Ten problem rozwiązano w tym artykule: http://www.asp.net/web-api/overview/extensibility/using-twe-web-api-dependency -resolver – Oblomingo

Odpowiedz

25

obchodzenie się z kontrolera i ApiController jest inna, ponieważ mają zupełnie różne klasy base:

używam biblioteki Unity.MVC4 dla kontrolera DI (http://www.nuget.org/packages/Unity.MVC4/)

Install-Package Unity.MVC4 

i Unity.WebAPI DI (http://www.nuget.org/packages/Unity.WebAPI/)

Install-Package Unity.WebAPI 

Twój inicjującego powinna być kombinacją obu:

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

Uwaga Miałem również zrobić, aby dodać niektóre rejestracja, aby strona pomocy działała,

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

Jako właściciel Unity.MVC4 czekam na wdrożenie WebApi w naszej bibliotece.

+0

Ta odpowiedź rozwiązała mój problem z Unity i WebApi Controller, dzięki @Oliver. – Jenan

0

Po zainstalowaniu jedności dla ASP.NET Web API, robi wszystko z wyjątkiem dodać następującą linię do Global.asax

Bootstrapper.Initialise(); 

Więc trzeba dodać, że do metody 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); 
} 
Powiązane problemy