Я пытаюсь решить проблему с регистрацией классов конфигурации. В моем инсталляторе есть следующее:
Сначала я регистрирую свою открытую универсальную фабрику
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()));
Я бы предпочел более автоматический способ регистрации моих конфигурационных компонентов.