Castle Windsor解决零个或多个实现

时间:2017-01-03 15:59:17

标签: c# castle-windsor

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

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

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

Windsor容器配置为使用ArrayResolver:

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

这一切都运行正常,并为各种T实例注入了一个或多个服务。

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

问题是,如果对于给定的T没有IService的具体实现,如何在没有实现的情况下注册IService的定义,那么容器是否知道类型?

我目前正在使用:

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

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

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

1 个答案:

答案 0 :(得分:4)

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

使用第二个参数注册ArrayResolver指定允许空数组 - 如果相关组件未注册,则属于这种情况:

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

所以行为完全符合要求。