0

次のクラス階層があります。

public class FirstProvider : IFirstProvider
{        
    public FirstProvider (string data, ISecondProvider provider)
    {
        ...
    }
}

public class SecondProvider : ISecondProvider
{
    public SecondProvider (string data)
    {
        ...
    }
}

public interface IProviderFactory
{
    T Create<T>(string data) where T : IProvider;
}

IFirstProvider と ISecondProvider はどちらも IProvider を実装しており、コンテナーに適切に登録されています。私がやろうとしているのは、次のように IProviderFactory から FirstProvider のインスタンスを取得することです。

public void DoSomething()
{
    var provider = _providerFactory.Create<IFirstProvider>("my data");
}

この時点で、次の例外が発生します。

「依存関係がありません。

コンポーネント SecondProvider は文字列に依存しており、解決できませんでした。

依存関係がコンテナにサービスとして正しく登録されているか、インライン引数として提供されていることを確認してください。」

Windsor は、クラスのインスタンスを作成するために解決しなければならない依存関係のチェーンを通じて、ITypedFactory のパラメーターを渡さないように見えます。このデザインをサポートできる別の方法はありますか、それともデザインを再検討する必要がありますか?

4

1 に答える 1

0

コンポーネントが必要に応じて正しく登録されていないようです。登録コードのブロックを提供していただけますか?

問題を解決するには、「コンポーネント ファクトリとしてのデリゲート」を試す必要があると思います。役立つオーバーロードがいくつかあります。

このようなもの:

container.Register(Component.For<ISecondProvider>().
    .UsingFactoryMethod(container =>
    {
        /* your code */
    }));
container.Register(Component.For<IFirstProvider>().
    .UsingFactoryMethod(container =>
    {
        var prvoider = container.Resolve<ISecondProvider>();
        /* your code */
    }));

また、型を解決するときに引数を渡すこともできます。「コンストラクターのパラメーターを渡すキャッスル ウィンザー」という回答済みの質問があります。

于 2013-09-14T20:08:02.330 に答える