Castle Windsor IoC Property Injection simple how-to

asp.net-mvc, c#, castle-windsor, dependency-injection, inversion-of-control

Solution

Both constructor and property injection work when the root object is resolved by the container. In this case, your `AccountController` would be the root object that Windsor would need to create.

In order to wire this up, you should use a controller factory. Once the controller is registered and resolved by the container, everything should work as you expect.

Problem

OK I think there is maybe too much information about Castle Windsor because looking for these keywords gives me examples of everything, and frankly I don't understand enough about how it works to properly troubleshoot this. I have tried quite a few permutations with little luck at this point. I have an `IUnitOfWorkFactory` that I want to instantiate as a singleton. So, I install Castle Windsor, write a bit of code like so: ``` iocContainer = new WindsorContainer() .Install(FromAssembly.This()); var propInjector = iocContainer.Register( Component.For<IUnitOfWorkFactory>() .LifestyleSingleton() .Instance(new NHUnitOfWorkFactory()) ); propInjector.Resolve<IUnitOfWorkFactory>(); ``` This gets called from my `Application_Start` method. I have an `AccountController` wired up like so: ``` public class AccountController : SecureController { public IUnitOfWorkFactory UnitOfWorkFactory { get; set; } ... ``` ...as far as I can figure, this should just "work" (although don't ask me how). But my property is always null when I try to use it. It seems like I'm missing something silly and simple, but I have no idea what it is. I have also tried ``` var propInjector = iocContainer.Register( Component.For<IUnitOfWorkFactory>() .ImplementedBy<NHUnitOfWorkFactory>() .LifestyleSingleton() ); ``` with no success. What am I doing wrong? CONCLUSION I was missing several steps here. I had built an installer and a bootstrapper per the tutorial, but I registered my services at the wrong spot... before building the controller factory. Now my bootstrapper looks like this: ``` iocContainer = new WindsorContainer() .Install(FromAssembly.This()); var controllerFactory = new WindsorControllerFactory(iocContainer.Kernel); ControllerBuilder.Current.SetControllerFactory(controllerFactory); iocContainer.Register( Component.For<IUnitOfWorkFactory>() .ImplementedBy<NHUnitOfWorkFactory>() .LifestyleSingleton() ); ``` ... and my property injections were no longer null.... now I just have to debug the other 87 problems...

Original source