One of the most annoying things that we have to do during development is updating configuration files. That is why convention over configuration is such a successful concept. The problem is what to do when you can mostly use the convention, but need to supply configuration values as well.
Well, one of the nice things about Windsor is the ability to merge several sources of information transparently. Given this configuration:
<configuration> <configSections> <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" /> </configSections> <castle> <facilities> <facility id="rhino.esb" > <bus threadCount="1" numberOfRetries="5" endpoint="msmq://localhost/demo.backend" /> <messages> </messages> </facility> </facilities> <components> <component id="Demo.Backend.SendEmailConsumer"> <parameters> <host>smtp.gmail.com</host> <port>587</port> <password>*****</password> <username>*****@ayende.com</username> <enableSsl>true</enableSsl> <from>*****@ayende.com</from> <fromDisplayName>Something</fromDisplayName> </parameters> </component> </components> </castle> </configuration>
And this auto registration:
var container = new WindsorContainer(new XmlInterpreter()); container.Register( AllTypes.Of(typeof (ConsumerOf<>)) .FromAssembly(typeof(Program).Assembly) );
We now get the benefit of both convention and configuration. We can let the convention pick up anything that we need, and configure just the values that we really have to configure.