An interesting feature of Castle Windsor is the ability to specify parameter overrides for a constructor using anonymous objects.
You define an anonymous object with properties named like the parameter you want to override and assign some value to it. You can either directly provide a value for that parameter or the name of a mapping you registered for the type of that parameter.
That means if you have a class with a dependency like this one:
public class MyService : IMyService
{
public IFoo SomeFoo { get; set; }
public MyService(IFoo someFoo)
{
this.SomeFoo = someFoo;
}
}
and two classes that implement IFoo called Foo and Bar. Foo is registered as the default mapping (without a name) and Bar is registered as an additional mapping for IFoo with the name “Bar”:
container.RegisterType<IFoo, Foo>();
container.RegisterType<IFoo, Bar>("Bar");
You can use the AnonymousParameterOverride to specify that you want to use the named mapping instead of the default one:
container.RegisterType<IMyService, MyService>(new AnonymousParameterOverride(new { foo = "Bar" });
Now this looks a little bit better than the default way Unity offers you to do this which is something like this:
container.RegisterType<IMyService, MyService>(
new InjectionConstructor(new ResolvedParameter(typeof(IFoo), "Bar"));
But still not quite as fluent as I would like to see it. Unity does not really have a fluent configuration API but I took the liberty to write one.
The ConfigurationBuilder will be the subject of a series of posts on its own so for now let me just show you a glimpse at what is possible with it:
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.For<IMyService>().Use<MyService>().Ctor(new { foo = "Bar" });
Much better isn’t it?
Get the source code for the AnonymousParameterOverride here (project TecX.Unity folder Injection and the test suite that shows how to use it in TecX.Unity.Test).