2012-07-15 25 views
16

Problema: Estoy usando MVC4 WebAPI y estoy lanzando un error durante una llamada a Get().Error "CommentsController no tiene un constructor predeterminado"

error:

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)"} 

estoy feliz de dar cualquier código necesario simplemente que me haga saber lo que desea ver.

controlador:

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

¿Ha configurado correctamente un contenedor DI y lo lanzó desde el inicio de la aplicación? ¿Has configurado una instancia de ICommentRepository para inyectar? –

+0

No tengo. ¿Sería mejor utilizar Unity o Ninject? Esos son los únicos dos que estoy interesado en usar, entiendo el concepto de IoC y DI, pero estoy tratando de aprender a usarlo con MVC4 y WebAPI ... ¿acabo de agregar eso a través de NuGet? –

Respuesta

6

Se costuras como está utilizando la aplicación por defecto de HttpControllerActivator que no funcionará con la inyección de dependencia. Pruebe this integra el contenedor de la unidad para manejar la dependencia, pero puede modificarlo para usar cualquier implementación de DI que desee.

+0

¿Por qué votar abajo? DefaultHttpControllerActivator simplemente requiere un constructor predeterminado, por lo que debe crear su propia y la solución más limpia para este contenedor DI. – Rafal

+0

El enlace proporcionado en la respuesta de Rafal me ayuda a orientarme en la dirección correcta. –

+0

Como los enlaces pueden fallecer, ASÍ, aliente las respuestas para incluir la información relevante para una solución en la respuesta. Si el contenido vinculado se elimina o cambia, la respuesta será inútil para otros que lo encuentren más adelante. Esa podría ser la razón por la que alguien ha votado (no yo), aunque es mala forma de votar sin hacer ningún comentario sobre por qué. – Zaphod

1

No estoy seguro de qué contenedor de IOC está utilizando, personalmente uso Ninject y here son las instrucciones que uso para que esto funcione correctamente.

Cuestiones relacionadas