城堡windsor容器可以返回实现2个接口的组件的相同实例

时间:2009-08-17 11:37:46

标签: castle-windsor

Castle Windsor Container是否可以让一个组件实现两个不同的接口,然后在解析它时返回相同的组件实例?例如;

var windsor = new WindsorContainer()
    .AddComponent<InterfaceA, ClassAB>()
    .AddComponent<InterfaceB, ClassAB>();

var classAB1 = windsor.Resolve<InterfaceA>();
var classAB2 = windsor.Resolve<InterfaceB>();

Assert.AreSame(classAB1, classAB2);

如果我按照所示尝试此操作,我会收到消息已经为给定密钥注册了一个组件,如果我提供了不同的密钥,那么它将返回类{{}的两个单独实例1}}。

编辑:理想情况下,我想在配置文件中执行此操作。

2 个答案:

答案 0 :(得分:11)

[TestFixture]
public class Forwarding {
    public interface InterfaceA {}

    public interface InterfaceB {}

    public class ClassAB: InterfaceA, InterfaceB {}

    [Test]
    public void tt() {
        var container = new WindsorContainer();
        container.Register(Component.For<InterfaceA, InterfaceB>().ImplementedBy<ClassAB>());
        var a = container.Resolve<InterfaceA>();
        var b = container.Resolve<InterfaceB>();
        Assert.AreSame(a, b);
    }
}

答案 1 :(得分:1)

我知道一个解决方案 - 可以这样做:

var someInstance = new Instance();
var container = new WindsorContainer();

container.Register(Component.For(typeof(IFirstInterface)).Instance(someInstance));
container.Register(Component.For(typeof(ISecondInterface)).Instance(someInstance));

...但是你失去了容器实例化Instance类的能力,因此它的依赖关系不会自动解决。当然,如果您的实例没有任何依赖关系,您可能不关心这一点。