嗨,我是温莎城堡的新手,正在努力理解一些基础知识,所以我想我发布一个问题,而不是通过代码,希望能尽快解决我的问题。
我有一个需要从配置文件 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
我的第一个问题:这个错误怎么可能(没有注册其他内容)/或者它是否意味着比看起来更微妙的东西?第二个问题:将配置信息获取到需要它的类的最佳实践是什么(我是不是错了)?
谢谢你的帮助