gpt4 book ai didi

caSTLe-windsor - 根据 CaSTLe Windsor 中的名称约定动态解析

转载 作者:行者123 更新时间:2023-12-03 18:42:44 26 4
gpt4 key购买 nike

我有一个看似简单的用例。有一个 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

这些在处理器类中用作依赖项。它是在 XML 中配置的,因此可以在运行时进行操作
<component id="Processor 
type="Processor">
<parameters>
<reader>CommaSeparetedCsvReader_Skips2Rows</reader>
</parameters>
</component>

理想情况下,我只想注册 CommaSeparetedCsvReader 组件,但是当尝试解析 CommaSeparetedCsvReader_Skips2Rows 时,它应该去除后缀,解析它并相应地更改属性。

是否有可能以某种方式修改 Resolve() 行为?

谢谢,
汤姆

最佳答案

如果您使用 TypedFactoryFacility 解析组件,创建自定义 ITypedFactoryComponentSelectors 可能会对您有所帮助。我需要更多关于您如何创建阅读器的详细信息,以便为您提供更多信息。

亲切的问候,
马尔维恩。

编辑 ====================================

让我们添加一个例子:

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];
}
}

- - 登记
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())),

- - 用法
var factory = _container.Resolve<IFooFactory>(); // in general this would just be a dependency in the constructor.
var foo = factory.CreateFoo("Foo2Name");

只需根据您的需要调整组件选择器。如有必要,如果构造函数需要容器未提供的参数,您还可以将其他参数传递给 CreateFoo。

更多信息: http://docs.castleproject.org/Windsor.Typed-Factory-Facility-interface-based-factories.ashx

关于caSTLe-windsor - 根据 CaSTLe Windsor 中的名称约定动态解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14099692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com