Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I configure a single component instance providing multiple services in Castle.Windsor?

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! :P

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

like image 961
Ash Avatar asked Mar 26 '09 01:03

Ash


2 Answers

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!

like image 170
Steven Lyons Avatar answered Oct 03 '22 13:10

Steven Lyons


Have you tried using the Forward method:

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

From my experiments and from the documentation:

register the service types on behalf of this component

i think it shoud do the trick.

like image 21
Igor Brejc Avatar answered Oct 03 '22 14:10

Igor Brejc