C# 注册:can';t重写由";注册的类型;“所有类型”;加上;“组件”;
在DLL中,我们定义了两个类(“Class1”和“Class2”),它们继承自接口(“IIInterface”)和基类(“BaseClass”) 我们使用Castle Windsor的Fluent注册API()自动将从“BaseClass”(在该DLL中)继承的所有类注册到它们各自的接口 对于特定的个性化,我们(从今天起)使用了一个“castle.xml”文件,它覆盖(使用“组件”标记)接口和具体类之间的关联(由Fluent Registration Api注册)。我们在WindsorContainer的构造函数中加载该xml文件 代码如下所示: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
//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);