6

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

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

例如:

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

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

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

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

有谁明白我的意思,有没有人知道如何通过组件的 XML 配置来实现这一点?

4

4 回答 4

3

您是否检查过似乎是您正在寻找的这个问题的答案(尤其是论坛帖子链接)。一些示例使用瞬态生命周期,但我认为它也适用于 Singleton。

论坛帖子的主要收益是:

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

解决方案是使用流利的界面(和最近的主干构建),并且我上次看到无法在 xml 中进行配置。但是,它可能有一个设施。

祝你好运!

于 2009-03-26T03:14:58.913 回答
1

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

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

从我的实验和文档中:

代表该组件注册服务类型

我认为它应该做的伎俩。

于 2009-07-15T07:24:09.813 回答
0

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

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

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

于 2009-03-26T14:36:38.760 回答
0

我正在寻找相同的答案,而这篇文章是我用谷歌所能得到的最远的。我发现使用

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

似乎对我有用。

于 2014-06-05T15:38:15.973 回答