【问题标题】:How do I configure a single component instance providing multiple services in Castle.Windsor?如何在 Castle.Windsor 中配置提供多种服务的单个组件实例?
【发布时间】:2009-03-26 01:57:28
【问题描述】:

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

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

例如:

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

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

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

大声笑,我认为这就像泥巴一样清晰! :P

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

【问题讨论】:

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


    【解决方案1】:

    您是否查看了您正在寻找的this question 的答案(尤其是论坛帖子链接)。一些示例使用瞬态生命周期,但我认为它也适用于 Singleton。

    forum post 的主要收益是:

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

    解决方案是使用流畅的界面(和最近的主干构建),我上次看到无法在 xml 中进行配置。不过,它may be possible 有一个设施。

    祝你好运!

    【讨论】:

      【解决方案2】:

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

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

      根据我的实验和文档:

      代表该组件注册服务类型

      我认为它应该可以解决问题。

      【讨论】:

      • 有没有办法从配置 XML 中做到这一点?
      【解决方案3】:

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

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

      我相信这应该可行。但是,出于显而易见的原因,这需要在代码配置中。

      【讨论】:

      • 这样做的主要问题是使用“new”运算符,这意味着您不会对 AB 使用自动装配。
      • 最后一行应该是 container.Register( Component.For&lt;IB&gt;().Instance( ab).Named("IBImplementation") ); 或者你会得到 ComponentRegistrationException: Component AB could not be registered。已经有一个同名的组件。
      【解决方案4】:

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

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

      似乎对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-11
        • 2020-11-20
        • 1970-01-01
        • 2014-10-07
        • 2011-09-27
        • 2018-04-14
        • 2016-01-07
        相关资源
        最近更新 更多