【问题标题】:Share castle windsor singleton instance across multiple components跨多个组件共享城堡温莎单例实例
【发布时间】:2011-10-11 09:27:57
【问题描述】:

我希望能够做到这一点:

<component id="Component1" service="Foo.IFoo, Foo" type="Foo.Bar, Foo" lifestyle="singleton" />
<component id="Component2" service="Foo.IFoo, Foo" type="Foo.Bar, Foo" lifestyle="singleton" />

这样当我这样做时:

IFoo foo = m_container.Resolve<IFoo>("Component1");

或者这个:

IFoo foo = m_container.Resolve<IFoo>("Component2");

..我得到相同的单例实例,而不是每个组件的单独实例。

这可能吗?

谢谢。

【问题讨论】:

  • 如果只需要一个组件,为什么还要注册两个组件?
  • 在实际代码中,组件名是一个接口名。我希望能够将 ISomething 映射到单例实例,并将 ISomethingElse 映射到同一个实例。我需要在运行时关闭接口名称,所以我需要通过城堡配置查找共享实例。
  • 我已经在不使用 Castle 的情况下解决了这个问题,但如果可能的话,我想使用它。它用于缓存,其中 N 个接口解析到任何给定的缓存实例,因此我可能需要多个组件用于一个单例实例。

标签: inversion-of-control castle-windsor ioc-container


【解决方案1】:

如果您在运行时只有“名称”接口,您打算如何在 Windsor 容器上调用通用 Resolve 方法?如果您真的只想要一个 IFoo 的单例实例而不管组件“名称”如何,那么只需将一个注册为单例并调用:

IFoo foo = m_container.Resolve<IFoo>();

如果您希望多个接口返回相同的组件,您可以考虑使用 Forward 类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多