Castle windsor Windsor使用密钥解析依赖项

Castle windsor Windsor使用密钥解析依赖项,castle-windsor,Castle Windsor,我使用castle Windsor以以下方式注册了多个接口实例: ServiceLocatorHelper.Register( Component.For<ISerializerAdapter>() .ImplementedBy<SerializerAdapter>(), Component.For<IDriver>() .ImplementedBy<FileDriver>() .Na

我使用castle Windsor以以下方式注册了多个接口实例:

ServiceLocatorHelper.Register(
    Component.For<ISerializerAdapter>()
        .ImplementedBy<SerializerAdapter>(),
    Component.For<IDriver>()
        .ImplementedBy<FileDriver>()
        .Named(SerializationType.Binary.ToString()),
    Component.For<IDriver>()
        .ImplementedBy<XmlDriver>()
        .Named(SerializationType.Xml.ToString()),
    Component.For<IBroker>().ImplementedBy<Broker>()
    );
+ IBroker
  - IDriver
    types
    {
     - FileDriver
     - XmlDriver
    }
  - ISerializerAdapter
IBroker broker = container.Resolve<IBroker>();
IDriver driver = broker.Driver;
Assert.IsTrue(driver.GetType() == typeof(FileDriver));
因此,为了创建新对象,这是默认的构造函数顺序:

IBroker broker = new Broker(new IDriver(new ISerializerAdapter));
问题是: 当我以以下方式使用castle解析新的IDriver时:

ServiceLocatorHelper.Register(
    Component.For<ISerializerAdapter>()
        .ImplementedBy<SerializerAdapter>(),
    Component.For<IDriver>()
        .ImplementedBy<FileDriver>()
        .Named(SerializationType.Binary.ToString()),
    Component.For<IDriver>()
        .ImplementedBy<XmlDriver>()
        .Named(SerializationType.Xml.ToString()),
    Component.For<IBroker>().ImplementedBy<Broker>()
    );
+ IBroker
  - IDriver
    types
    {
     - FileDriver
     - XmlDriver
    }
  - ISerializerAdapter
IBroker broker = container.Resolve<IBroker>();
IDriver driver = broker.Driver;
Assert.IsTrue(driver.GetType() == typeof(FileDriver));
IBroker broker=container.Resolve();
IDriver driver=broker.driver;
Assert.IsTrue(driver.GetType()==typeof(FileDriver));
属性IDriver的类型始终为FileDriver,而如果我使用键解析IDriver,它将返回正确的类型:

IDriver fileDriver = container.Resolve<IDriver>(SerializationType.Binary.ToString());
Assert.IsTrue(fileDriver.GetType() == typeof(FileDriver));

IDriver fileDriver = container.Resolve<IDriver>(SerializationType.Xml.ToString());
Assert.IsTrue(fileDriver.GetType() == typeof(XmlDriver));
IDriver fileDriver=container.Resolve(SerializationType.Binary.ToString());
Assert.IsTrue(fileDriver.GetType()==typeof(fileDriver));
IDriver fileDriver=container.Resolve(SerializationType.Xml.ToString());
Assert.IsTrue(fileDriver.GetType()==typeof(XmlDriver));
我怎么能这样说呢?

IBroker broker = container.Resolve<IBroker>("Xml");
Assert.IsTrue(broker.Driver.GetType() == typeof(XmlDriver));
IBroker broker=container.Resolve(“Xml”);
Assert.IsTrue(broker.Driver.GetType()==typeof(XmlDriver));

这是使用的典型场景

只需声明工厂接口:

public interface IBrokerFactory {
    IBroker GetXmlBroker();
    IBroker GetBinaryBroker();
}
并按如下方式注册:

Component.For<IBrokerFactory>().AsFactory(),
Component.For<IBroker>().
          ImplementedBy<Broker>().
          Named("BinaryBroker").
          DependsOn(Dependency.OnComponent("BinaryDriver")),
Component.For<IBroker>().
          ImplementedBy<Broker>().
          Named("XmlBroker").
          DependsOn(Dependency.OnComponent("XmlDriver")),
Component.For<IDriver>().ImplementedBy<FileDriver>().Named("BinaryDriver"),
Component.For<IDriver>().ImplementedBy<XmlDriver>().Named("XmlDriver"),

Component.For().AsFactrory()
Ok中有拼写错误。我更正了错误,但不得不在底部添加额外字符,以克服一些奇怪的6字符最小编辑。。。