2012-07-15 13 views
16

Problem: Używam interfejsu webowego MVC4 i zgłaszam błąd podczas wywołania Get().Błąd "CommentController nie ma domyślnego konstruktora"

Błąd:

System.ArgumentException: Type 'Comments2.Controllers.CommentsController' does not have a default constructor

StackTrace:

at System.Linq.Expressions.Expression.New(Type type) 
at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"} 

Cieszę dać żadnego kodu wymaganego po prostu daj mi znać, co chcesz zobaczyć.

Kontroler:

namespace Comments2.Controllers 
{ 
    //[Authorize] 
    public class CommentsController : ApiController 
    { 
     ICommentRepository repository; 

    public CommentsController(ICommentRepository repository) 
    { 
     this.repository = repository; 
    } 

    [Queryable] 
    public IQueryable<Comment> GetComments() 
    { 
     return repository.Get().AsQueryable(); 
    } 

    public Comment GetComment(int id) 
    { 
     Comment comment; 
     if (!repository.TryGet(id, out comment)) 
      throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound)); 
     return comment; 
    } 
} 

JavaScript:

$(function() { 
    $("#getComments").click(function() { 
     // We're using a Knockout model. This clears out the existing comments. 
     viewModel.comments([]); 

     $.get('/api/comments', function (data) { 
      // Update the Knockout model (and thus the UI) with the comments received back 
      // from the Web API call. 
      viewModel.comments(data); 
     }); 

    }); 
}); 
+1

Czy prawidłowo skonfigurowałeś kontener DI i uruchomiłeś go od początku aplikacji? Czy skonfigurowałeś instancję ICommentRepository do wstrzyknięcia? –

+0

Nie mam. Czy byłoby lepiej dla użytkownika Unity lub Ninject? To są jedyne dwie, które mnie interesują, rozumiem pojęcie IoC i DI, ale próbuję nauczyć się używać go z MVC4 i WebAPI ... czy dodaję to przez NuGet? –

Odpowiedz

6

szwy jak używasz domyślnego realizację HttpControllerActivator który nie będzie działać z wstrzykiwania zależności. Wypróbuj this integruje kontener jedności do obsługi zależności, ale możesz go zmodyfikować, aby użyć dowolnej implementacji DI, którą chcesz.

+0

Dlaczego głosowanie w dół? DefaultHttpControllerActivator po prostu wymaga domyślnego konstruktora, więc musisz stworzyć własne, a najczystszym rozwiązaniem jest kontener DI. – Rafal

+0

Link podany w odpowiedzi Rafała pomaga we właściwym kierunku. –

+0

Ponieważ łącza mogą zginąć, SO zachęć odpowiedzi, aby zawierały odpowiednie informacje dotyczące rozwiązania w odpowiedzi. Jeśli połączona treść zostanie usunięta lub zmieniona, odpowiedź będzie bezużyteczna dla innych, którzy znajdą to później. Być może dlatego ktoś głosował (nie ja), chociaż nie jest to dobra forma głosowania bez komentarza. – Zaphod

1

Nie jestem pewien, jakiego kontenera IOC używasz, ja osobiście używam Ninject i here są instrukcje, których używam, aby to działało poprawnie.

Powiązane problemy