Как автоматически зарегистрировать компоненты, используя универсальный FactoryMethod с Castle Windsor - PullRequest
0 голосов
/ 10 июня 2011

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

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

        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()));

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

1 Ответ

0 голосов
/ 12 июня 2011

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

...