Определите, может ли данный тип в настоящее время быть разрешен контейнером Castle Windsor - PullRequest
1 голос
/ 10 марта 2010

У меня есть сценарий, в котором мне нужно знать, может ли определенный тип в настоящее время быть разрешен контейнером Windsor. Проблема в том, что этот тип имеет зависимости. Итак, у меня есть класс ProductRepository, который реализует IRefDataRepository и зависит от IProductDataProvider. Мне нужно знать, могу ли я успешно разрешить IRefDataRepository из контейнера.

Я попытался использовать IKernel.HasComponent(typeof(IRefDataRepository)) IKernel.GetAssignableHandlers(typeof(IRefDataRepository)), оба из которых возвращают ProductRepository, даже если IProductDataProvider не зарегистрировано. (Так IWindsorContainer.Resolve(typeof(IRefDataRepository)) бросит)

Мое текущее решение - написать метод расширения, который фактически пытается разрешить тип (через IWindsorContainer.Resolve(IRefDataRepository)), перехватывает исключение и возвращает true, если тип разрешается, и false в противном случае. Но мне интересно, есть ли лучший способ.

1 Ответ

1 голос
/ 10 марта 2010

Вы делаете это неправильно.

Вы должны были разделить вашу программу на две явные части:

  • Настройка
  • фактический код

Вы регистрируете вещи в настройке, а затем запускаете реальный код, где вы можете разрешить вещи. Если вы не можете ее устранить, в коде установки есть ошибка.

2-я часть кода не должна знать о контейнере, а опрос контейнера является сильным запахом кода.

Теперь, сказав, что, когда вам по какой-то причине необходимо сделать это, найдите обработчик для нужного вам компонента и проверьте его состояние (handler.CurrentState). Если это Valid, ваш компонент безопасен для разрешения. Противоположное не обязательно должно быть правдой!

...