Как автоматически регистрировать компоненты с помощью Generic FactoryMethod в Castle Windsor

Я пытаюсь решить проблему с регистрацией моих классов конфигурации. У меня в установщике есть:

Сначала я регистрирую свою открытую фабрику генериков

        container.AddFacility<FactorySupportFacility>()
            .Register(Component.For(typeof (IConfigurationProvider<>))
                    .ImplementedBy(typeof (AppSettingsConfigurationProvider<>)));

Потом пытаюсь зарегистрировать все конкретные имп. IConfiguration, и мне нужно использовать мой зарегистрированный имп. 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()));

Я бы предпочел более автоматический способ регистрации моих компонентов конфигурации.


person Martin Mellqvist    schedule 10.06.2011    source источник


Ответы (1)


Было бы что-то похожее на то, что описал Бен Холл, использование DictionaryAdapter работает для вас? Обратите внимание, что если вы используете Windsor 2.5, у вас уже есть DictionaryAdapter (сейчас он является частью Castle.Core.dll).

person Krzysztof Kozmic    schedule 11.06.2011
comment
Да, это решает проблему, спасибо, Крыштоф! Но, допустим, я хотел бы загрузить свою конфигурацию из другого хранилища, например из базы данных. Есть ли способ зарегистрировать все компоненты конфигурации, реализующие IConfiguration, а затем заставить Windsor автоматически определять тип зарегистрированного компонента IConfigurationProvider ‹›? - person Martin Mellqvist; 13.06.2011