Привет, я новичок в Castle Windsor и изо всех сил пытаюсь понять некоторые основы, поэтому я решил, что публикую вопрос, а не просматриваю код в надежде быстрее решить свою проблему.
У меня есть веб-сервис, который должен извлекать информацию из файла конфигурации web.config. Эта информация находится в разделе настраиваемой конфигурации, и мне интересно, как я могу передать эту информацию классу, который в ней нуждается. Я не хочу привязывать этот класс к файлу конфигурации, так как я могу разместить его через IIS или специальную службу Windows. Моя первая попытка была сделать что-то вроде этого:
iocCon.Register(Component.For<ErrorMessagesSection>().LifeStyle.Singleton.Instance(FindConfigSection<ErrorMessagesSection>()));
private T FindConfigSection<T>() where T : ConfigurationSection
{
System.Configuration.Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/web.config");//TODO: remove this hard coding to iis hosting .OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigurationSectionGroupCollection sectionGroups = config.SectionGroups;
foreach (ConfigurationSectionGroup sectionGroup in sectionGroups)
foreach (ConfigurationSection configurationSection in sectionGroup.Sections)
if (configurationSection.GetType() == typeof(T))
return (T) configurationSection;
return null;
}
Раздел может быть определен только один раз, поэтому он в основном захватывает раздел, чтобы его можно было вставить в конструктор класса фабрики сообщений об ошибках. Это не вызывает никаких ошибок, однако я заметил, что раздел создается дважды, что вызывает другие проблемы (которые я должен исправить, но ...) в любом случае, чтобы обойти это, я решил, что создам единственный экземпляр и зарегистрирую его сам поэтому я попробовал:
UGLY_HACK = new ConfigFileErrorMessageManager(eMessages);
iocContationer.Register(Component.For<IErrorMessageManager>().ImplementedBy<ConfigFileErrorMessageManager>().LifeStyle.Singleton.Instance(UGLY_HACK));
Это первая регистрация только что созданного контейнера, и он взрывается следующим:
[ComponentRegistrationException: This component has already been assigned implementation xxx.ConfigFileErrorMessageManager]
Castle.MicroKernel.Registration.ComponentRegistration`1.ImplementedBy(Type type, IGenericImplementationMatchingStrategy genericImplementationMatchingStrategy) +310
Castle.MicroKernel.Registration.ComponentRegistration`1.Instance(TService instance) +44
Мой первый вопрос: как возможна эта ошибка (больше ничего не зарегистрировано) / или это означает что-то более тонкое, чем кажется? Второй вопрос: как лучше всего получить информацию о конфигурации для классов, которым она нужна (я ошибаюсь)?
Спасибо за вашу помощь