2016-03-07 2 views
2

Вот вопрос под руку:Убедитесь, что контроллер имеет без параметров открытого конструктора с использованием Ninject

Призывая мой CustomerController через URL, я получаю следующее исключение:

ExceptionMessage :

Произошла ошибка при попытке создать контроллер типа 'CustomerController'. Убедитесь, что контроллер имеет пустой конструктор .

Я использую следующий URL,:

Обратите внимание:/api/Customer/ вызова работали прежде, чем я переработан логику в бизнес класс и внедренная инъекция зависимостей.

Мои исследования показывают, что я не регистрирую свой интерфейс и класс правильно с Ninject, но не уверен, какой шаг у меня отсутствует.

исследуемых Ссылки:

Вот мой вопрос Что вызывает это исключение? Я регистрирую свой интерфейс/класс в пределах Ninject, но, похоже, он неправильно распознает отображение. Есть предположения?

контроллер клиента

public class CustomerController : ApiController 
{ 
    private readonly ICustomerBusiness _customerBusiness; 

    public CustomerController(ICustomerBusiness customerBusiness) 
    { 
     _customerBusiness = customerBusiness; 
    } 

    // GET api/Customer 
    [HttpGet] 
    public IEnumerable<Customer> GetCustomers() 
    { 
     return _customerBusiness.GetCustomers(); 
    } 

    // GET api/Customer/Id 
    [HttpGet] 
    public IEnumerable<Customer> GetCustomersById(int customerId) 
    { 
     return _customerBusiness.GetCustomerById(customerId); 
    } 
} 

Клиент Бизнес

public class CustomerBusiness : ICustomerBusiness 
{ 
    private readonly DatabaseContext _databaseContext = new DatabaseContext(); 

    public IEnumerable<Customer> GetCustomers() 
    { 
     return _databaseContext.Customers; 
    } 

    public IQueryable<Customer> GetCustomerById(int customerId) 
    { 
     return _databaseContext.Customers.Where(c => c.CustomerId == customerId); 
    }  
} 

Клиент Бизнес Интерфейс

public interface ICustomerBusiness 
{ 
    IQueryable<Customer> GetCustomerById(int customerId); 
    IEnumerable<Customer> GetCustomers(); 
} 

NinjectWebCommon

using System; 
using System.Web; 
using Microsoft.Web.Infrastructure.DynamicModuleHelper; 
using MyReservation.API; 
using MyReservation.API.Business; 
using Ninject; 
using Ninject.Web.Common; 

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(NinjectWebCommon), "Start")] 
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(NinjectWebCommon), "Stop")] 

namespace MyReservation.API 
{ 
    public static class NinjectWebCommon 
    { 
     private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

     /// <summary> 
     /// Starts the application 
     /// </summary> 
     public static void Start() 
     { 
      DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
      DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
      bootstrapper.Initialize(CreateKernel); 
     } 

     /// <summary> 
     /// Stops the application. 
     /// </summary> 
     public static void Stop() 
     { 
      bootstrapper.ShutDown(); 
     } 

     /// <summary> 
     /// Creates the kernel that will manage your application. 
     /// </summary> 
     /// <returns>The created kernel.</returns> 
     private static IKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      try 
      { 
       kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
       kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

       RegisterServices(kernel); 
       return kernel; 
      } 
      catch 
      { 
       kernel.Dispose(); 
       throw; 
      } 
     } 

     /// <summary> 
     /// Load your modules or register your services here! 
     /// </summary> 
     /// <param name="kernel">The kernel.</param> 
     private static void RegisterServices(IKernel kernel) 
     { 
      kernel.Bind<ICustomerBusiness>().To<CustomerBusiness>(); 
     }   
    } 
} 
+0

Вам нужно придать ICustomerBusiness вашему CustomerController. Подсказка о том, как это сделать, вы можете найти здесь: http://stackoverflow.com/questions/2227548/creating-an-instance-using-ninject-with-additional-parameters-in-the-constructor – MarkusE

+0

Возможный дубликат [ Ninject "Нет конструктора без параметров, определенного для этого объекта."] (Http://stackoverflow.com/questions/20127901/ninject-no-parameterless-constructor-defined-for-this-object) – BatteryBackupUnit

+0

В этом или подобных вопросах было задано много раз. Два вопроса, которые вы перечисляете в разделе «Исследованные ссылки», предназначены для единства. Единство может иметь другое поведение, поэтому оно может и не применяться. Ваша проблема в том, что вы не настроили свой проект должным образом, чтобы использовать ninject - ошибка, получаемая вами при получении от преобразователя зависимостей по умолчанию - ninject будет * никогда * не выделять это сообщение об исключении. – BatteryBackupUnit

ответ

4

Для одной и той же проблемы я установил NuGet пакеты

  • Ninject
  • ninject.web.common
  • ninject.web.common .webhost
  • ninject.web.webapi
  • ninject.web.webapi.webhost

    и работал

+0

Спасибо за ответ, но ошибка по-прежнему сохраняется. – ChaseHardin

+0

Можете ли вы также предоставить файл packages.config? –

+0

Просто создал простой проект API и обнаружил, что 'Ninject.Web.WebApi.WebHost' не был включен ... После установки этого пакета он работал. Спасибо за помощь! – ChaseHardin

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

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