Вот вопрос под руку:Убедитесь, что контроллер имеет без параметров открытого конструктора с использованием Ninject
Призывая мой CustomerController
через URL
, я получаю следующее исключение:
ExceptionMessage :
Произошла ошибка при попытке создать контроллер типа 'CustomerController'. Убедитесь, что контроллер имеет пустой конструктор .
Я использую следующий URL,:
Обратите внимание:
/api/Customer/
вызова работали прежде, чем я переработан логику в бизнес класс и внедренная инъекция зависимостей.
Мои исследования показывают, что я не регистрирую свой интерфейс и класс правильно с Ninject
, но не уверен, какой шаг у меня отсутствует.
исследуемых Ссылки:
- Make sure that the controller has a parameterless public constructor error
- Make sure that the controller has a parameterless public constructor in Unity
Вот мой вопрос Что вызывает это исключение? Я регистрирую свой интерфейс/класс в пределах
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>();
}
}
}
Вам нужно придать ICustomerBusiness вашему CustomerController. Подсказка о том, как это сделать, вы можете найти здесь: http://stackoverflow.com/questions/2227548/creating-an-instance-using-ninject-with-additional-parameters-in-the-constructor – MarkusE
Возможный дубликат [ Ninject "Нет конструктора без параметров, определенного для этого объекта."] (Http://stackoverflow.com/questions/20127901/ninject-no-parameterless-constructor-defined-for-this-object) – BatteryBackupUnit
В этом или подобных вопросах было задано много раз. Два вопроса, которые вы перечисляете в разделе «Исследованные ссылки», предназначены для единства. Единство может иметь другое поведение, поэтому оно может и не применяться. Ваша проблема в том, что вы не настроили свой проект должным образом, чтобы использовать ninject - ошибка, получаемая вами при получении от преобразователя зависимостей по умолчанию - ninject будет * никогда * не выделять это сообщение об исключении. – BatteryBackupUnit