C# – How to configure a single component instance providing multiple services in Castle.Windsor

ccastle-windsorinversion-of-control

I'd like to configure the Windsor container so that a single, singleton-style instance can provide two or more services through the container.

I've found that using the same type in multiple component declarations (XML-based config) will result in an instance of that type being created to provide each component's service interface, which is not the behaviour I desire.

For example:

interface IA { }
interface IB { }
class AB : IA, IB { ... } 

I want the one instance of AB to provide both the IA and IB services.

The specific reason I want to do this is that my concrete DAO implementation extends multiple interfaces. On the flip side, I have several worker components which hold a reference to different interfaces. The concrete DAO instance respects this, but the constructors of these seperate worker components want the implementation of their seperate interfaces and I desire Castle.Windsor to pass the same object instance through to these worker containers via the respective service requests.

lol, I think that was clear as mud! 😛

Does anyone understand what I mean, and has anyone got any ideas how I can acheive this through the XML configuration fo the components?

Best Answer

Have you checked out the answer to this question (especially the forum post link) that appears to be what you are looking for. Some of the examples are using the Transient lifecycle but I think it will work with Singleton also.

The main pay-off of the forum post is:

container.Register(Component.For<IEntityIndexController, ISnippetController>()
.ImplementedBy<SnippetController>()
.LifeStyle.Transient); 

The solution is uses the fluent interface (and a recent trunk build) and it wasn't possible to configure in xml last I saw. However, it may be possible with a facility.

Good luck!