如何在Castle.Windsor中配置提供多个服务的单个组件实例?

时间:2009-03-26 01:57:28

标签: c# inversion-of-control castle-windsor

我想配置Windsor容器,以便单个单例样式的实例可以通过容器提供两个或更多服务。

我发现在多个组件声明(基于XML的配置)中使用相同的类型将导致创建该类型的实例以提供每个组件的服务接口,这不是我想要的行为。

例如:

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

我希望AB的一个实例同时提供IA和IB服务。

我想要这样做的具体原因是我的具体DAO实现扩展了多个接口。另一方面,我有几个工作组件,它们包含对不同接口的引用。具体的DAO实例尊重这一点,但是这些单独的工作组件的构造函数需要实现它们的单独接口,我希望Castle.Windsor通过相应的服务请求将相同的对象实例传递给这些工作容器。

大声笑,我认为这很清楚! :P

有没有人理解我的意思,有没有人有任何想法如何通过组件的XML配置实现这一点?

4 个答案:

答案 0 :(得分:3)

您是否查看了this question(特别是论坛帖子链接)的答案,该答案似乎正是您要找的内容。一些示例使用的是Transient生命周期,但我认为它也适用于Singleton。

forum post的主要回报是:

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

解决方案是使用流畅的界面(以及最近的主干版本),最后我看到的是无法在xml中配置。但是,may be possible有设施。

祝你好运!

答案 1 :(得分:1)

您是否尝试过使用Forward方法:

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

从我的实验和文档中:

  

代表此组件注册服务类型

我认为应该这样做。

答案 2 :(得分:0)

您可以注册对象的实例(而不是实现)来负责不同的实现:

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

我认为应该有效。但是,出于明显的原因,这需要代码配置。

答案 3 :(得分:0)

我正在寻找相同的答案,这篇文章是我用google获得的最远的帖子。我发现使用

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

似乎为我做了诀窍。