在构造函数参数中指定依赖实现

Specify dependency implementation in constructor parameter

假设我有一个接口 IA、两个实现 A1A2 以及一个依赖于 IA 的依赖 class B . Windsor容器中同一个接口的两个实现是这样注册的:

container.Register(Component.For<IA>()
    .ImplementedBy<A1>());
container.Register(Component.For<IA>()
    .ImplementedBy<A2>());

有没有办法在依赖 class B 中指定使用哪个实现

例如在 Autofac 中,我可以这样使用 KeyFilterAttribute

class B 
{
    ...
    public B([KeyFilter("A1")]IA a)
    {
        ...
    }
}

有几种方法可以实现这一点,哪一种最合适取决于更大的上下文。

  1. 如果您一一注册组件,就像服务的问题示例代码 Windsor uses the first component registered as the default 中那样。因此,在您的 B 中,您可以保证获得 A1.

  2. 实现的服务
  3. 明确地说,你可以强制一个组件成为默认组件(也适用于按惯例注册

.

container.Register(
   Component.For<IA>().ImplementedBy<A1>(),
   Component.For<IA>().ImplementedBy<A2>().IsDefault());
  1. 或者,从消费端的角度来看you can configure B to pick either A1 or A2 regardless of the defaults(最接近Autofac

.

container.Register(
   Component.For<B>()         
      .DependsOn(Dependency.OnComponent<IA, A1>))