Castle Windsor 解析零个或多个实现
Castle Windsor resolve zero or more implementations
(稍微简化了场景以突出特定问题)。
我正在尝试使用 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());
但是因为这是由具体的 类 驱动的,所以它显然没有注册任何 'unused' IService。
回退是为任何没有 'real' 实现的 T 提供 IService 的存根实现,但我不想用许多这样的存根污染代码。 (也可以通过开放的泛型提供一些反射...)。
回答我自己的问题,已被同事引导...
使用第二个参数注册 ArrayResolver 指定允许空数组 - 如果相关组件未注册,则会出现这种情况:
container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel, true));
所以行为完全符合要求。
(稍微简化了场景以突出特定问题)。
我正在尝试使用 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());
但是因为这是由具体的 类 驱动的,所以它显然没有注册任何 'unused' IService。
回退是为任何没有 'real' 实现的 T 提供 IService 的存根实现,但我不想用许多这样的存根污染代码。 (也可以通过开放的泛型提供一些反射...)。
回答我自己的问题,已被同事引导...
使用第二个参数注册 ArrayResolver 指定允许空数组 - 如果相关组件未注册,则会出现这种情况:
container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel, true));
所以行为完全符合要求。