Modular IoC container initialization using Castle Windsor
Posted by bartmaes on June 22, 2010
You might want to split up the initialization code for your IoC container in several classes. There might be several reasons to do so:
- You want to be able to easily replace just a subset of the components configured in your IoC container.
- You are building a class libary or a framework and you want to provide others a default initialization routine for the classes in your library/framework.
After some searching on the internet, it seems that Castle Windsor provides a nice way of doing this by using the IWindsorInstaller:
public class MyLibrariesWindsorInstaller: IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
//container.AddComponent<IMyInterface1, MyImplementation1>();
//…
}
}
You can find another example here.
Now you need to call the Windsor Installer from your main WindsorContainerBootstrapper. (A bootstrapper is a component that runs as part of the startup process to activate a more complex system.)
public class WindsorBootstrapper
{
private static IWindsorContainer _container;
public static void Initialize()
{
//initialize container with some IWinsorInstallers
container = new WindsorContainer(new XmlInterpreter());
//delegate initialzation to the configured Windsor Installers
_container.Install(_container.ResolveAll<IWindsorInstaller>());
}
}
In your app.config, you can now configure a list of IWindsorInstallers:
<Configuration>
<configSections>
<section name=”castle” type=”Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor” />
</configSections>
<castle>
<components>
<component id=”installer” service=”Castle.Windsor.IWindsorInstaller, Castle.Windsor” type=”MyLibrary.MyLibrariesWindsorInstaller, MyLibrary” />
<!– Configure more IWindsorInstallers here –>
</components>
</castle>
I find this a clean solution, which I found here. The only thing left to do is to call the WindsorBootstrapper.Initialize() method at application startup.
One last advice: be careful for registring components for the same interface in different IWindsorInstallers. Using this solution, there is still only one IoC container in your application…
Krzysztof Koźmic said
Bart,
Just wanted to drop you a line that the scenario you’re describing here is built into Windsor itself starting with upcoming version 2.5
both from code via FromAssembly class http://stw.castleproject.org/Windsor.Installers.ashx
and from XML: http://stw.castleproject.org/Windsor.Registering-Installers.ashx