我有一个看似简单的用例.有一个ICsvReader组件.我们在这里简单地将它命名为Reader.我们加载了一组已知的CSV文件,其中一些有标题,有些则没有.目前有多个读者:Reader_Skips1Row,Reader_Skips2Rows等.
有没有办法只注册一个组件并让Windsor查看组件密钥,剥离"_Skips ..."部分并解析所需的组件并设置相关属性?
我试过没有运气的subresolver和设施.
编辑
是的,只有一个实现,但它被用作依赖项并配置为按名称解析.阅读器在代码中配置
Component.For<ICsvReader>()
.ImplementedBy<CommaSeparetedCsvReader>()
.DependsOn(new { SkipHeader = true, HeaderRowsToSkip = 2 } )
.Named("CommaSeparetedCsvReader_Skips2Rows")
.Lifestyle.Transient
Component.For<ICsvReader>()
.ImplementedBy<CommaSeparetedCsvReader>()
.DependsOn(new { SkipHeader = true, HeaderRowsToSkip = 1 } )
.Named("CommaSeparetedCsvReader_Skips1Row")
.Lifestyle.Transient
Component.For<ICsvReader>()
.ImplementedBy<CommaSeparetedCsvReader>()
.Named("CommaSeparetedCsvReader")
.Lifestyle.Transient
Run Code Online (Sandbox Code Playgroud)
它们用作处理器类中的依赖项.它以XML格式配置,因此可以在运行时进行操作
<component id="Processor
type="Processor">
<parameters>
<reader>CommaSeparetedCsvReader_Skips2Rows</reader>
</parameters>
</component>
Run Code Online (Sandbox Code Playgroud)
理想情况下,我只想注册CommaSeparetedCsvReader组件,但是当尝试解析CommaSeparetedCsvReader_Skips2Rows时,它应该去除后缀,解析它并相应地更改属性.
是否有可能以某种方式修改Resolve()行为?
谢谢,汤姆
Mar*_*ijn 10
如果要使用TypedFactoryFacility解析组件,则创建自定义ITypedFactoryComponentSelectors可能对您有所帮助.我需要更多有关如何创建读者的详细信息,以便为您提供更多信息.
亲切的问候,Marwijn.
编辑=====================================
让我们添加一个例子:
public interface IFoo
{
}
public class Foo1 : IFoo
{
}
public class Foo2 : IFoo
{
}
public interface IFooFactory
{
IFoo CreateFoo(string which);
}
public class FooFactoryComponentSelector : DefaultTypedFactoryComponentSelector
{
protected override string GetComponentName(MethodInfo method, object[] arguments)
{
return (string)arguments[0];
}
}
Run Code Online (Sandbox Code Playgroud)
---注册
container.AddFacility<TypedFactoryFacility>();
Component.For<IFoo>().Named("Foo1Name").ImplementedBy<Foo1>(),
Component.For<IFoo>().Named("Foo2Name").ImplementedBy<Foo2>(),
Component.For<IFooFactory>().AsFactory(f => f.SelectedWith(new FooFactoryComponentSelector())),
Run Code Online (Sandbox Code Playgroud)
---用法
var factory = _container.Resolve<IFooFactory>(); // in general this would just be a dependency in the constructor.
var foo = factory.CreateFoo("Foo2Name");
Run Code Online (Sandbox Code Playgroud)
只需根据您的需要调整组件选择器.如果构造函数需要容器未提供的参数,如有必要,您还可以将其他参数传递给CreateFoo.
更多信息:http://docs.castleproject.org/Windsor.Typed-Factory-Facility-interface-based-factories.ashx
| 归档时间: |
|
| 查看次数: |
2312 次 |
| 最近记录: |