我正试图解决注册配置类的问题。我的安装程序中有以下内容:
首先我注册我的开放式通用工厂
container.AddFacility<FactorySupportFacility>()
.Register(Component.For(typeof (IConfigurationProvider<>))
.ImplementedBy(typeof (AppSettingsConfigurationProvider<>)));
然后我试图注册所有具体的impl。 IConfiguration和我需要使用我的注册impl。 IConfigurationProvider解决它们。
问题是我的工厂看起来像这样:
public class AppSettingsConfigurationProvider<TConfiguration>
where TConfiguration : class, IConfiguration, new()
{
public TConfiguration Build()
{
var config = new TConfiguration();
var properties = typeof(TConfiguration).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var p in properties)
{
if (!p.CanWrite)
continue;
if (p.GetSetMethod(false) == null)
continue;
var settingsKey = string.Format("{0}.{1}", p.ReflectedType.FullName, p.Name);
p.SetValue(config, Convert.ChangeType(ConfigurationManager.AppSettings[settingsKey], p.PropertyType), null);
}
return config;
}
}
所以我需要设置泛型类型。
有没有办法摆脱这种情况,所以我不需要像这样逐个注册每个配置组件:
container
.Register(
Component.For<DummyConfiguration>()
.ImplementedBy<DummyConfiguration>()
.UsingFactoryMethod(kernel => kernel.Resolve<IConfigurationProvider<DummyConfiguration>>().Build()));
我更喜欢使用更自动的方式来注册我的配置组件。
答案 0 :(得分:0)
类似于Ben Hall described的东西,使用DictionaryAdapter为你工作吗?请注意,如果您使用的是Windsor 2.5,那么您已经拥有了DictionaryAdapter(它现在是Castle.Core.dll
的一部分)。