C# 在Castle Windsor通用对象配置中使用组件id
两个问题合一,但非常相关 Castle Windsor是否可以解析以下配置条目:- Assembly.Namespace.Object1`2[[${ComponentD1}],${ComponentD2}]],程序集C# 在Castle Windsor通用对象配置中使用组件id,c#,generics,castle-windsor,C#,Generics,Castle Windsor,两个问题合一,但非常相关 Castle Windsor是否可以解析以下配置条目:- Assembly.Namespace.Object1`2[[${ComponentD1}],${ComponentD2}]],程序集 其中,组件1和组件2被定义为组件。Castle Windsor似乎没有解析ComponentId,它只是在Castle.Windsor程序集中查找Component1 如果你不能回答第一个问题,那么第二个问题就开始了。如果必须使用完整的程序集引用而不是组件ID,如何将任何参数传递给
其中,组件1和组件2被定义为组件。Castle Windsor似乎没有解析ComponentId,它只是在Castle.Windsor程序集中查找Component1 如果你不能回答第一个问题,那么第二个问题就开始了。如果必须使用完整的程序集引用而不是组件ID,如何将任何参数传递给正在创建的对象?例如,设置ComponentId1.Field1=“blah”,或将某些内容传递给ComponentId1的构造函数 希望这是有道理的 更新- 根据对代码的请求,我完成了以下工作- 物体
public class Wrapper<T, T1> where T : ICollector where T1:IProcessor
{
private T _collector;
private T1 _processor;
public Wrapper(T collector, T1 processor)
{
_collector = collector;
_processor = processor;
}
public void GetData()
{
_collector.CollectData();
_processor.ProcessData();
}
}
public class Collector1 : ICollector
{
public void CollectData()
{
Console.WriteLine("Collecting data from Collector1 ...");
}
}
public class Processor1 : IProcessor
{
public void ProcessData()
{
Console.WriteLine("Processing data from Processor1 ...");
}
}
这将返回manager对象,填充包装器数组,并使用正确的收集器和转换器配置包装器
我知道这里的Castle配置中存在错误,这就是为什么我要问这个问题,我不知道如何设置配置来完成我要做的事情,甚至不知道是否可以在Castle Windsor中执行更新2
好了,现在开始有意义了:)正如我从一开始就说的,看起来您正在寻找服务覆盖:
<components>
<component id="Wrapper1" type="CastleWindsorPlay.Wrapper`2[<<closing types go here>>]/>
<parameters>
<collector>${collector1WithId1}</collector>
<collector>${processor3WithId3}</collector>
</parameters>
</component>
<component id="Wrapper2" type="CastleWindsorPlay.Wrapper`2[<<closing types go here>>]/>
<parameters>
<collector>${collector1WithId5}</collector>
<collector>${processor3WithId8}</collector>
</parameters>
</component>
</components>
${collector1WithId5}
${processor3WithId8}
更新
好的,谢谢你的例子。出现错误的原因是,您分别将组件采集器1
和组件处理器3
注册为服务ICCollector
和IPProcessor
。
您没有采集器1
和处理器3
的服务,因此当Windsor试图提供它们时,它无法找到它们,因此出现异常消息
您需要将其注册为适当的服务,以使其正常工作
我不知道你想在这里做什么,但我想你是在寻找和是什么潜在的问题导致了这种情况?此外,一旦解决了此对象,您将如何使用它?你会在哪里注射?请发布一些代码,说明您试图实现的功能。组件1和组件2并被注入Object1以更改其行为。不知道混乱在哪里。在Object1中,我可以定义一些属性,比如私有T ComponentOne,这些属性将具有注入对象的行为,这可能是我误用了Castle Windsor。我尝试使用Castle Windsor通过配置来设置一系列对象。因此,我可以有一个对象数组,比如{Object1,Object2,Object3。这个数组以及随后的系统行为可以通过Castle配置进行更改,而无需重新构建程序集。同样,请发布代码,一个简单的测试用例或其他东西。否则,人们会试图回答你的问题(像我一样)必须猜测和/或更努力工作。好吧,Windsor OOTB无法做到这一点,但可以通过一些扩展来实现。但请发布代码。抱歉,服务覆盖和内联参数无法回答如何在使用泛型的组件定义中使用组件id,或如何将参数传递给通过泛型传递的对象。hmmmm,有趣。我不知道如何做我想做的事情,甚至不知道我是否可以使用Castle Windsor。我的想法是,在配置中,我可以使用配置中刚刚定义的收集器和处理器来声明新的包装器。我能让它工作的唯一方法是在配置中和解析中定义收集器(例如Wrapper=resolve等等)第二个要求是我可以将不同的参数传递给为包装器定义的每个收集器。比如说包装器1使用Collector1,将Id=1传递给收集器,包装器2使用Collector1,将Id=2,等等,我不明白的是-如果你想解析类
Collector1
,Processor3
为什么你将它们注册为接口吗?我刚才说我删除了它们,这是一个错误。我添加了第二个更新,以再次尝试澄清我实际上想问的问题,我想你可能拥有我想要的,从外观上看,我只是从一个错误的角度来看它。让我快速体验一下你的建议
var wrapper = (Wrapper<ICollector, IProcessor>) container.Resolve("Wrapper1");
wrapper.GetData();
<components>
<component id="Wrapper1"
type="CastleWindsorPlay.Wrapper`2[${Collector1}(id=1)],[${Processor3}]], CastleWindsorPlay" />
<component id="Wrapper2"
type="CastleWindsorPlay.Wrapper`2[${Collector1}(id=3)],[${Processor3}]], CastleWindsorPlay" />
</components>
<component id="Manager"
type="CastleWindsorPlay.Manager,CastleWindsorPlay">
<parameters>
<wrappers>
<array>
<item>${Wrapper1}</item>
<item>${Wrapper2}</item>
</array>
</wrappers>
</parameters>
var manager = (Manager)container.Resolve("Manager");
<components>
<component id="Wrapper1" type="CastleWindsorPlay.Wrapper`2[<<closing types go here>>]/>
<parameters>
<collector>${collector1WithId1}</collector>
<collector>${processor3WithId3}</collector>
</parameters>
</component>
<component id="Wrapper2" type="CastleWindsorPlay.Wrapper`2[<<closing types go here>>]/>
<parameters>
<collector>${collector1WithId5}</collector>
<collector>${processor3WithId8}</collector>
</parameters>
</component>
</components>