Типизированная фабрика молча отбрасывает аргументы, которые не могут быть сопоставлены с конструктором?
Вопрос
Должна ли типизированная фабрика генерировать исключение, если в функции создания указаны аргументы, которые нельзя сопоставить с конструктором? Например
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 использует ту же точку расширения для преобразования аргументов перед их передачей в контейнер.