Question

I have been trying to get Castle Windsor to inject my DB Context to my controllers I have been following the tutorials on the Castle Windsor website

my code is as follows
Bootstrapper

internal class IOCContainerBootstrap
    {
        private static IWindsorContainer container;
        public static void Configure()
        {

            container = new WindsorContainer()
                .Install(FromAssembly.This());

            var controllerFactory = new GravityClimbingControllerFactory(container.Kernel);

            ControllerBuilder.Current.SetControllerFactory(controllerFactory);

        }

        #region IDisposable Members

        public static void Dispose()
        {
            container.Dispose();
        }

        #endregion
    }

Installers

public class ControllersInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(Classes.FromThisAssembly()
                                .BasedOn<IController>()
                                .LifestyleTransient());

            container.Register(Component.For<DbContext>().ImplementedBy<GravityClimbingEntities>());
        }
    }

    public class APIInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(Classes
                .FromThisAssembly()
                .BasedOn<IHttpController>()
                .ConfigureFor<ApiController>(c => { c.PropertiesIgnore(pi => false); })
                .LifestyleTransient());
        }
    }

And finally My API Controller

public class ArticalsController : ApiController
    {
        private readonly DbContext _context;
        private readonly Db.Repositories.ArticalRepository repository;
        public ArticalsController(DbContext context)
        {
            _context = context;
            repository = new Db.Repositories.ArticalRepository(context);
        }

        [HttpGet]
        public string HelloWorld()
        {
            return "Hello.world";
        }
    }

When I Debug I get no errors and it says it can resolve the dependency

Debugger Information

But when i try to call the API controller I get the following Error Message

{
    "Message" : "An error has occurred.",
    "ExceptionMessage" : "Type 'ArticalsController' does not have a default constructor",
    "ExceptionType" : "System.ArgumentException"
}

Is there something silly I am doing wrong, that I cannot see?

Was it helpful?

Solution

For people who are facing the same issue I found the issue.

Castle Windsor didn't know about the IHTTPControler (Base for the APIController) so i needed to create an IHttpControllerActivator and attach it to the GlobalConfiguration.Configuration.Services

I found this link to enable this here

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top