2017-01-19 10 views
1

Я тестирую Windsor.Castle для разрешения моих общих компонентов.Регистрация общих компонентов в Windsor.Castle: разница в поведении между Type.GetType и typeof

Я конфигурирование моего контейнера с линиями, как следующее:

container.Register(Component.For(typeof(ICommand<,>)).ImplementedBy(Type.GetType("WCExp.Test.GetAllCommand`2")).Named("GetAllCommand")); 
container.Register(Component.For(typeof(ICommand<,>)).ImplementedBy(typeof(WindsorCastleExperiments.Implementations.GetAllCommand<,>)).Named("GetAllCommandOriginal")); 

Как вы можете видеть ImplementedBy предусмотрен типом, либо через Type.GetType() или через TYPEOF().

Теперь, когда я тестировал, я заметил, что иногда зарегистрированная служба не является классом реализации, а интерфейсом.

Сообщение об ошибке: Ошибка при создании экземпляра ICommand ... является абстрактным. (оставлена ​​строка полного типа)

Возможно ли, что при использовании Type.GetType() иногда может возвращаться интерфейс для заданной строки типа, даже если заданная строка типа является определением типа класса?

Таким образом, можно

Type.GetType("WCExp.Test.GetAllCommand`2") 

возвращают интерфейс ICommand <,> ...?

Это происходило для классов, которые находились в зависимой сборке. Для классов в той же сборке, как я настройка этой проблемы не представлял себя

Полных источники (пока?): https://github.com/schwarzie2478/WindsorCastleExperiments

ответ

2

я решил мою проблему. В конце концов, это не имело никакого отношения к замку. (Но замок позволяет это произойти):)

Тип.GetType ожидает строку типа, что включает в себя assemblyName для типов, существующих за пределами текущей сборки.

Но поскольку я никогда не проверял, что возвращает эта функция, я не знал, что регистрация происходила против нулевого значения, которое позволяет Castle, но тогда интерфейс регистрируется как служба, а не как реализация, как я ожидал ...