在 Castle Windsor 中这相当于什么?

What is the equivalent for this in Castle Windsor?

假设我有例如:

public interface IYetAnotherInterface : IMyBaseInterface
public class JustAClass: IYetAnotherInterface

使用 Unity DI 容器这是有效的:

container.RegisterType<IMyBaseInterface, IYetAnotherInterface>();
container.RegisterType<IYetAnotherInterface, JustAClass>();

如何使用 Castle Windsor 执行此操作?这失败了:

container.Register(
   Component
      .For<IMyBaseInterface>()
      .ImplementedBy<IYetAnotherInterface >());

container.Register(
   Component
      .For<IYetAnotherInterface >()
      .ImplementedBy<JustAClass>());

我正在尝试解析构造函数中的 IYetAnotherInterface,例如

public Foo(IYetAnotherInterface i, ...)
container.Register(
    Component
      .For<IMyBaseInterface>()
      .ImplementedBy<JustAClass>());

container.Register(
    Component
      .For<IYetAnotherInterface >()
      .ImplementedBy<JustAClass>());

实际上,对于您给定的场景(依赖于 IYetAnotherInterface 的 ctor),只需第二次注册就足够了。

我不确定 container.RegisterType<Interface1, Interface2>(); 在 Unity 中的作用。看起来它连接了一个组件以解决另一个组件?

如果是这样,您有两个选择。

  • 如果您想拥有两个组件,请按照@vzwick 的回答进行操作。

  • 如果你只想要一个组件,请使用以下内容。

.

Component
   .For<IMyBaseInterface, IYetAnotherInterface>()
   .ImplementedBy<JustAClass>()

因此,在第一个选项中,您最终会得到两个独立的组件,都由 JustAClass 支持,每个组件都暴露一个 service 接口:一个用于 IMyBaseInterface 另一个是 IYetAnotherInterface.

在第二个选项中,您最终得到一个组件,同时公开 IMyBaseInterfaceIYetAnotherInterface

The documentation 对概念的解释非常好,我强烈建议您熟悉它。