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}}。
编辑:理想情况下,我想在配置文件中执行此操作。
答案 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
类的能力,因此它的依赖关系不会自动解决。当然,如果您的实例没有任何依赖关系,您可能不关心这一点。