2

質問

コンストラクターにマップできない作成関数で指定された引数がある場合、型付きファクトリは例外をスローする必要がありますか? 例えば

public class Foo
{
    public Foo() : Foo(new Guid())
    {
    }

    // Used to be 'public Foo(string bar)'
    public Foo(Guid guid)
    {
    }
}

public interface FooFactory
{
    Foo CreateFoo(string bar);
}

バグの一部は、文字列を受け入れるコンストラクターが Foo で見つからない場合に、例外をスローする代わりに、型指定されたファクトリがデフォルトのコンストラクターをサイレントに呼び出すことによって引き起こされていることがわかりました。Foo のコンストラクターは変更されましたが、型付きファクトリでコンストラクターを作成する方法は更新されていませんでした。

部分解決?

少し実験して、潜在的な解決策を見つけました。

public class OurComponentSelector : DefaultTypedFactoryComponentSelector
{
    public override IDictionary GetArguments(MethodInfo method, object[] arguments)
    {
        // Check an appropriate constructor can be found, throw exception if not
    }
}

これは適切な回避策でしょうか?

4

1 に答える 1

0

はい。これは、まさに ITypedFactoryComponentSelector が提供する拡張性のタイプです。

Windsor 独自の DefaultDelegateComponentSelector は、同じ拡張ポイントを使用して、引数をコンテナに渡す前に変換します。

于 2012-07-16T23:34:26.597 に答える