【问题标题】:Castle Windsor resolve zero or more implementations温莎城堡解决零个或多个实现
【发布时间】:2017-01-03 15:59:16
【问题描述】:

(略微简化的场景以突出特定问题)。

我正在尝试使用 Castle Windsor 来解析一个组件,该组件具有一个带有单个参数的构造函数,该参数是一个服务接口数组:

public class TestClass<T>
{
    public TestClass(IService<T>[] services)
    {
        ...
    }
}

Windsor 容器配置为使用 ArrayResolver:

container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel));

这一切都很好,并且为各种 T 实例注入了一个或多个服务。

但是,对于某些 T,没有 IService&lt;T&gt; 的实现。目标是使用长度为零的数组调用构造函数。

问题是,如果给定的 T 没有 IService 的具体实现,我如何注册没有实现的 IService 的定义,以便容器知道类型?

我正在使用:

container.Register(
    Classes.FromAssembly(Assembly.GetExecutingAssembly())
        .BasedOn<IService<>>()
        .WithService.FirstInterface());

但由于这是从具体类驱动的,它显然没有注册任何“未使用”的 IService。

Fallback 是为没有“真正”实现的任何 T 提供 IService 的存根实现,但我不希望用许多这样的存根污染代码。 (也可以通过一个开放的泛型提供一些反射......)。

【问题讨论】:

    标签: c# castle-windsor


    【解决方案1】:

    回答我自己的问题,由同事指导...

    使用第二个参数注册 ArrayResolver 指定允许空数组 - 如果有问题的组件未注册,就会出现这种情况:

    container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel, true));
    

    所以行为完全符合预期。

    【讨论】:

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