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

谁都会走 提交于 2019-12-07 02:32:24

问题


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?


回答1:


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!




回答2:


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.




回答3:


You can register an instance of an object (instead of an implementation) to be responsible for different implementations:

  var ab = new AB();
  container.Register( Component.For<IA>().Instance( ab) );
  container.Register( Component.For<IB>().Instance( ab) );

I believe that should work. However, that requires in code configuration, for apparent reasons.




回答4:


I was searching for the same answer, and this post is the farthest I could get with google. I found that using

Classes.FromThisAssembly().Where(t => t.FullName == "Namespace.Classname").WithServiceAllInterfaces()

Seems to do the trick for me.



来源:https://stackoverflow.com/questions/684257/how-do-i-configure-a-single-component-instance-providing-multiple-services-in-ca

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!