Замок: зарегистрировать интерфейсные прокси по соглашению
Я хочу зарегистрировать несколько компонентов, реализующих адаптер словаря, но AllTypes.From.. выбирает только типы классов. Я хочу сделать что-то вроде этого:
container.Register(AllTypes.FromAssemblyContaining<IFooSettings>()
.Where(type => type.IsInterface)
.Configure(component =>
component.UsingFactoryMethod((kernel, model, creationContext) => new DictionaryAdapterFactory().GetAdapter(creationContext.RequestedType, ConfigurationManager.AppSettings))));
Теперь я не могу создать собственную версию "AllTypes", так как ctor FromTypesDescriptor является внутренним. Есть идеи, как мне это сделать?
2 ответа
Это теперь работает в замке 3.3.0:
var dictionaryAdapterFactory = new DictionaryAdapterFactory();
container.Register(
Types.FromThisAssembly().Where(t => t.Name.EndsWith("Settings") && t.IsInterface)
.Configure(component => component.UsingFactoryMethod((kernel, model, creationContext) => dictionaryAdapterFactory.GetAdapter(creationContext.RequestedType, ConfigurationManager.AppSettings))));
Вы должны использовать "Типы", который также подбирает интерфейсы
Я делаю что-то подобное
container.Register(
AllTypes
.FromThisAssembly()
.Pick()
.WithService.DefaultInterface()
.Configure(r => r.LifeStyle.Transient));
Это регистрирует компоненты на основе соответствующего интерфейса и имени класса.
Так что, если я спрошу у Касла интерфейс под названием IFooSettings
тогда Касл по умолчанию вернет класс FooSettings
,
Есть ряд правил, которые вы можете использовать для регистрации, и вы можете увидеть их здесь. Не рекомендуется использовать метод Factory, который вы используете в своем примере.