4

一見単純なユースケースがあります。ICsvReader コンポーネントがあります。ここでは単に Reader と名付けましょう。既知の CSV ファイルのセットを読み込みますが、ヘッダーがあるものとないものがあります。現在、複数のリーダーがあります: Reader_Skips1Row、Reader_Skips2Rows など。

コンポーネントを 1 つだけ登録し、Windsor にコンポーネント キーを見て、「_Skips...」部分を削除し、関連するプロパティ セットで必要なコンポーネントを解決する方法はありますか?

サブリゾルバーとファシリティを試してみましたが、うまくいきませんでした。

編集

はい、実装は 1 つしかありませんが、依存関係として使用され、名前で解決されるように構成されています。リーダーはコードで構成されます

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() の動作を何らかの方法で変更することは可能ですか?

ありがとう、トム

4

1 に答える 1

11

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

于 2013-01-01T18:03:58.793 に答える