如何在Castle.Windsor中配置提供多个服务的单个组件实例?
我想配置Windsor容器,以便单个单例样式的实例可以通过容器提供两个或更多服务。
我发现在多个组件声明(基于XML的配置)中使用相同的类型将导致创建该类型的实例以提供每个组件的服务接口,这不是我想要的行为。
例如:
interface IA { } interface IB { } class AB : IA, IB { ... }
我希望AB的一个实例同时提供IA和IB服务。
我想要这样做的具体原因是我的具体DAO实现扩展了多个接口。 另一方面,我有几个工作组件,它们包含对不同接口的引用。 具体的DAO实例尊重这一点,但是这些单独的工作组件的构造函数需要实现它们的单独接口,我希望Castle.Windsor通过相应的服务请求将相同的对象实例传递给这些工作容器。
大声笑,我觉得这很清楚! :P
有没有人明白我的意思,有没有人有任何想法如何通过组件的XML配置实现这一点?
你有没有看过这个问题的答案(尤其是论坛post链接),看似你正在寻找什么。 一些示例使用的是Transient生命周期,但我认为它也适用于Singleton。
论坛post的主要回报是:
container.Register(Component.For() .ImplementedBy() .LifeStyle.Transient);
解决方案是使用流畅的界面(和最近的主干版本),我不能在最后看到的xml配置。 但是, 可以使用设施。
祝好运!
您是否尝试过使用Forward
方法:
container.Register(Component.For() .ImplementedBy() .Forward (typeof(ISnippetController)) .LifeStyle.Transient);
从我的实验和文档:
代表此组件注册服务类型
我认为它应该做的伎俩。
您可以注册对象的实例(而不是实现)来负责不同的实现:
var ab = new AB(); container.Register( Component.For().Instance( ab) ); container.Register( Component.For().Instance( ab) );
我相信这应该有效。 但是,出于明显的原因,这需要代码配置。
我正在寻找相同的答案,这篇文章是我可以用谷歌获得的最远的。 我发现使用了
Classes.FromThisAssembly().Where(t => t.FullName == "Namespace.Classname").WithServiceAllInterfaces()
似乎为我做了伎俩。