代码之家  ›  专栏  ›  技术社区  ›  Gareth

Castles Windsor容器能否返回实现2个接口的组件的相同实例

  •  5
  • Gareth  · 技术社区  · 17 年前

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

    var windsor = new WindsorContainer()
        .AddComponent<InterfaceA, ClassAB>()
        .AddComponent<InterfaceB, ClassAB>();
    
    var classAB1 = windsor.Resolve<InterfaceA>();
    var classAB2 = windsor.Resolve<InterfaceB>();
    
    Assert.AreSame(classAB1, classAB2);
    

    如果我如图所示尝试,我会得到一个异常消息 已经为给定的密钥注册了一个组件 ,如果我提供不同的键,那么它将返回类的两个独立实例。 ClassAB .

    编辑:理想情况下,我希望在配置文件中这样做。

    2 回复  |  直到 15 年前
        1
  •  11
  •   Mauricio Scheffer    17 年前
    [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);
        }
    }
    
        2
  •  1
  •   mookid8000    17 年前

    我知道一个解决办法-可以这样做:

    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 类,因此它的依赖项不会自动解析。当然,如果您的实例没有任何依赖关系,那么您可能不关心这一点。