如何使用Castle Windsor的Generic Factory Method自动注册组件

时间:2011-06-10 14:42:36

标签: 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()));

我更喜欢使用更自动的方式来注册我的配置组件。

1 个答案:

答案 0 :(得分:0)

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