C# 注册:can';t重写由";注册的类型;“所有类型”;加上;“组件”;

C# 注册:can';t重写由";注册的类型;“所有类型”;加上;“组件”;,c#,castle-windsor,registration,fluent,C#,Castle Windsor,Registration,Fluent,在DLL中,我们定义了两个类(“Class1”和“Class2”),它们继承自接口(“IIInterface”)和基类(“BaseClass”) 我们使用Castle Windsor的Fluent注册API()自动将从“BaseClass”(在该DLL中)继承的所有类注册到它们各自的接口 对于特定的个性化,我们(从今天起)使用了一个“castle.xml”文件,它覆盖(使用“组件”标记)接口和具体类之间的关联(由Fluent Registration Api注册)。我们在WindsorConta

在DLL中,我们定义了两个类(“Class1”和“Class2”),它们继承自接口(“IIInterface”)和基类(“BaseClass”)

我们使用Castle Windsor的Fluent注册API()自动将从“BaseClass”(在该DLL中)继承的所有类注册到它们各自的接口

对于特定的个性化,我们(从今天起)使用了一个“castle.xml”文件,它覆盖(使用“组件”标记)接口和具体类之间的关联(由Fluent Registration Api注册)。我们在WindsorContainer的构造函数中加载该xml文件

代码如下所示:

        //container's initialization:
        var resource = new FileResource("Castle.xml");
        var interpreter = new XmlInterpreter(resource);
        var container = new WindsorContainer(interpreter);
        container.AddFacility<TypedFactoryFacility>();

        //...

        //automatic type registration:
        container.Register(
            AllTypes
                .FromAssemblyContaining<BaseClass>()
                .BasedOn<BaseClass>()
                .WithService.Select(
                    (t1, t2) => t1.GetInterfaces()
                                    .Except(new[] {typeof (IDisposable)})
                                    .Union(new[] {t1}))
                .Configure(a => a.Named(a.ServiceType.Name)
                                    .LifeStyle.Transient)
                .AllowMultipleMatches()
            );
//容器的初始化:
var resource=newfileresource(“Castle.xml”);
var解释器=新的XML解释器(资源);
var容器=新WindsorContainer(解释器);
container.AddFacility();
//...
//自动类型注册:
集装箱。登记(
各种类型
.FromAssemblyContaining()
.BasedOn()
.WithService.Select(
(t1,t2)=>t1.GetInterfaces()
。除(新[]{typeof(IDisposable)})
.Union(新[]{t1}))
.Configure(a=>a.Named(a.ServiceType.Name)
.生活方式(暂时的)
.AllowMultipleMatches()
);
默认情况下,如果我们向Castle请求接口对象,我们得到“Class1”;要获得“Class2”,我们必须在“Castle.xml”文件中指定它

今天,我尝试摆脱castle.xml,在fluent配置中指定“Component”指令(在“AllTypes”指令之前):

container.Register(
组成部分
.对于()
.由()实施
(生活方式,短暂),;
。。。但我们仍然得到一个Class1对象,就好像“AllTypes”fluent指令覆盖了“Component”指令一样(这很奇怪,因为xml文件中的“Component”指令起作用)

我做错了什么

编辑:我通过键名“.Named()”访问组件,解决了问题(多亏了Krzysztof):

container.Register(
组成部分
.对于()
.由()实施
.Named(字体(界面).Name)
(生活方式,短暂),;

为了使问题不显示为未回答,答案在上面的注释中。

为了使问题不显示为未回答,答案在上面的注释中。

您使用的是什么版本?您确定所有组件在注册时都已注册,并且是按类型而不是按名称解析组件吗?@Krzysztof:我使用的是v。Castle.Microkernel的2.1.0.0。事实上,我们正在使用“return\u container.Resolve(key,dictionary)”…@Krzysztof:Named()非常有效,谢谢!现在我可以杀死所有的魔法弦了……:)酷,很高兴我能帮上忙你用的是什么版本?您确定所有组件在注册时都已注册,并且是按类型而不是按名称解析组件吗?@Krzysztof:我使用的是v。Castle.Microkernel的2.1.0.0。事实上,我们正在使用“return\u container.Resolve(key,dictionary)”…@Krzysztof:Named()非常有效,谢谢!现在我可以杀死所有的魔法弦了……:)酷,很高兴我能帮上忙
        container.Register(
            Component
                .For<IInterface>()
                .ImplementedBy<Class2>()
                .LifeStyle.Transient);
        container.Register(
            Component
                .For<IInterface>()
                .ImplementedBy<Class2>()
                .Named(typeof(IInterface).Name)
                .LifeStyle.Transient);