Типизированная фабрика молча отбрасывает аргументы, которые не могут быть сопоставлены с конструктором?

Вопрос

Должна ли типизированная фабрика генерировать исключение, если в функции создания указаны аргументы, которые нельзя сопоставить с конструктором? Например

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

Будет ли это подходящим решением?

1 ответ

Да. Это именно тот тип расширяемости, который ITypedFactoryComponentSelector предназначен для обеспечения.

Собственный Windsor DefaultDelegateComponentSelector использует ту же точку расширения для преобразования аргументов перед их передачей в контейнер.

Другие вопросы по тегам