Make sure the controller has a hassle-free public constructor using Ninject

Here is the problem:

When calling my CustomerController through a URL I get the following exception:

ExceptionMessage:

An error occurred while trying to create a controller such as' CustomerController. Make sure the controller has an unsigned public constructor.

I use the following URLs:

Note: The call /api/Customer/ worked before I reorganized the logic into a business class and implemented dependency injection.

My research shows that I am not correctly registering my interface and class with Ninject , but I don’t know which step I am missing.

Links investigated:

  • Make sure the controller has an error without a constructor
  • Make sure the controller has an immortal public constructor in Unity

Here is my question. What causes this exception? I am registering my interface / class inside Ninject , but it looks like it does not correctly recognize the mapping. Any suggestions?

Client controller

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

Business for customers

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

Customer Business Interface

 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>(); } } } 
+2
c # dependency-injection ninject
Mar 07 '16 at 0:55
source share
1 answer

For the same problem, I installed nuget packages

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

    and worked

+4
Mar 07 '16 at 11:48
source share



All Articles