2012-07-15 4 views
16

Проблема: Я использую MVC4 WebAPI и бросаю ошибку во время вызова Get().Ошибка «КомментарииКонтроллер не имеет конструктора по умолчанию»

Ошибка:

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

Я рад дать любой код, необходимый просто дайте мне знать, что вы хотели бы видеть.

Контроллер:

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

Вы правильно настроили контейнер DI и запустили его с начала приложения? Вы настроили экземпляр ICommentRepository для инъекций? –

+0

У меня нет. Было бы лучше, если бы пользователь Unity или Ninject? Это единственные, кого я заинтересован в использовании, я понимаю концепцию IoC и DI, но я пытаюсь научиться использовать ее с MVC4 и WebAPI ... Я просто добавляю это через NuGet? –

ответ

6

Это швы как вы используете реализацию по умолчанию HttpControllerActivator, который не будет работать с инъекцией зависимостей. Попробуйте this он интегрирует контейнер единицы для обработки зависимости, но вы можете изменить его, чтобы использовать любую реализацию DI, которую вы хотите.

+0

Почему голос? DefaultHttpControllerActivator просто требует конструктора по умолчанию, поэтому вам нужно создать свое собственное и самое чистое решение для этого контейнера DI. – Rafal

+0

Ссылка, содержащаяся в ответе Рафаля, поможет мне в правильном направлении. –

+0

Поскольку ссылки могут умереть, SO поощряет ответы, чтобы включить соответствующую информацию для решения в ответ. Если связанный контент удален или изменен, ответ будет бесполезен для других, кто это находит позже. Возможно, поэтому кто-то проголосовал (а не я), хотя это плохая форма для голосования, не комментируя почему. – Zaphod

1

Я не уверен, что вы используете IOC Container, я лично использую Ninject и here - это инструкции, которые я использую для правильной работы.

Смежные вопросы