2011-06-10 154 views
0

我正在尝试解决注册我的配置类时遇到的问题。我在我的安装程序如下:如何使用Castle Windsor的Generic FactoryMethod自动注册组件使用Castle Windsor

首先注册我的开放式泛型工厂

 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

类似于什么Ben Hall described,使用DictionaryAdapter为你工作?注意,如果你使用Windsor 2.5,你已经有了DictionaryAdapter(它现在是Castle.Core.dll的一部分)。

+0

是的,它确实解决了问题,谢谢Krysztof!但是,让我们说我想从其他商店,例如数据库加载我的配置。是否有办法注册实现IConfiguration的所有配置组件,然后让Windsor自动推断注册的IConfigurationProvider <>组件的类型? – 2011-06-13 07:22:41