Castle windsor Windsor使用密钥解析依赖项
我使用castle Windsor以以下方式注册了多个接口实例:Castle windsor Windsor使用密钥解析依赖项,castle-windsor,Castle Windsor,我使用castle Windsor以以下方式注册了多个接口实例: ServiceLocatorHelper.Register( Component.For<ISerializerAdapter>() .ImplementedBy<SerializerAdapter>(), Component.For<IDriver>() .ImplementedBy<FileDriver>() .Na
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字符最小编辑。。。