Skip to content

Instantly share code, notes, and snippets.

@martinnormark
Created July 17, 2012 09:17
Show Gist options
  • Star 27 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save martinnormark/3128275 to your computer and use it in GitHub Desktop.
Save martinnormark/3128275 to your computer and use it in GitHub Desktop.
Castle Windsor IoC Container setup for ASP.NET MVC

Castle Windsor IoC Container setup for ASP.NET MVC

  1. Create the following folder structure and files:

-- MyApp.Web (The MVC project)
---- PresentationLogic (folder)
------ Container (folder)
-------- BusinessLogicInstaller.cs
-------- ControllersInstaller.cs
-------- IocContainer.cs
-------- WindsorControllerFactory.cs

  1. Add the contents of each file in this Gist to your app. Rename namespace to fit to your application.

  2. Call IocContainer.Setup from Global.asax.cs. Example shown in this Gist.

That's it!

using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
using Castle.Windsor;
using MyApp.BusinessLogic.Facades;
namespace MyApp.Web.PresentationLogic.Container
{
public class BusinessLogicInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<IProductBusinessFacade>().ImplementedBy<ProductBusinessFacade>());
}
}
}
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
using Castle.Windsor;
namespace MyApp.Web.PresentationLogic.Container
{
public class ControllersInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(AllTypes.FromThisAssembly()
.Pick().If(t => t.Name.EndsWith("Controller"))
.Configure(configurer => configurer.Named(configurer.Implementation.Name))
.LifestylePerWebRequest());
}
}
}
void Application_Start(object sender, EventArgs e)
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
// Add this line to Application_Start in Global.asax.cs to setup the IoC Container.
IocContainer.Setup();
}
using System.Web.Mvc;
using Castle.Windsor;
using Castle.Windsor.Installer;
namespace MyApp.Web.PresentationLogic.Container
{
public static class IocContainer
{
private static IWindsorContainer _container;
public static void Setup()
{
_container = new WindsorContainer().Install(FromAssembly.This());
WindsorControllerFactory controllerFactory = new WindsorControllerFactory(_container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
}
}
}
using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Castle.MicroKernel;
namespace MyApp.Web.PresentationLogic.Container
{
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IKernel _kernel;
public WindsorControllerFactory(IKernel kernel)
{
this._kernel = kernel;
}
public override void ReleaseController(IController controller)
{
_kernel.ReleaseComponent(controller);
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
}
return (IController)_kernel.Resolve(controllerType);
}
}
}
@anasdove
Copy link

This source code is very useful for me to understand the Castle Windsor implementation.

Many thanks,
AnasDove

@zhuchunqing
Copy link

thanks

@dandamudi
Copy link

my MVC app usining Windsor Controlfactory, everything looks OK in Local but in QA, when load the controller my Return URl path changes, Account/login adds automatically, even my app doesn't have Account controller and login view

Url should come like this : myappQA.com/Home/Index
but it comes like : myappQa.com/Account/login?/Home/index

please help me

@jimy20
Copy link

jimy20 commented Apr 13, 2017

it is a very useful documentation of how to setup windsor IOC

@Leandro-Sousa
Copy link

Thank's! It's so very useful to me.

@obegendi
Copy link

why not transient life time for controller? Is it better usage for perwebrequest? I'm not quite sure for this.

@devairr
Copy link

devairr commented Sep 29, 2018

Thanks!

@rbforee
Copy link

rbforee commented Jun 17, 2019

I am having a problem in the ControllersInstaller with "AllTypes" not existing in the current context. Am i missing something?

using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
using Castle.Windsor;

namespace Kinetic.Web.Container
{
public class ControllersInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(AllTypes.FromThisAssembly()
.Pick().If(t => t.Name.EndsWith("Controller"))
.Configure(configurer => configurer.Named(configurer.Implementation.Name))
.LifestylePerWebRequest());
}
}
}

@martinnormark
Copy link
Author

martinnormark commented Jun 17, 2019 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment