Замок: зарегистрировать интерфейсные прокси по соглашению

Я хочу зарегистрировать несколько компонентов, реализующих адаптер словаря, но 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, который вы используете в своем примере.

Другие вопросы по тегам