Именованная массовая регистрация в windsor castle

#dependency-injection #castle-windsor #castle-windsor-3

#внедрение зависимостей #castle-Виндзор #castle-windsor-3

Вопрос:

В моем проекте у меня есть интерфейс iProcess и множество классов, реализующих этот интерфейс. Мне нужно зарегистрировать все эти реализации. Следующий код для меня работает нормально:

 Container.Register(Component.For<IProcess>().Named("SampleProcess").ImplementedBy<SampleProcess>());
Container.Register(Component.For<IProcess>().Named("SampleProcess2").ImplementedBy<SampleProcess2>());
  

Однако использование этого подхода для регистрации утомительно, если у меня много реализаций. Поэтому я ищу метод регистрации для регистрации всех реализаций iProcess в данной сборке по имени. Имя, которое следует использовать для регистрационного ключа, — это просто имя класса.

Может кто-нибудь, пожалуйста, дать мне подсказку, где искать?

Комментарии:

1. Разве это не то, что происходит по умолчанию, если вы явно не указываете имя?

Ответ №1:

Звучит как классический сценарий для convention registration API.

 container.Register(
    Classes.FromThisAssembly()
        .BasedOn<IProcess>()
        .WithServiceBase()
        // and then if you *really* need to explicitly control naming
        .Configure(c => c.Named(c.Implementation.Name)
        )
  

Обычно не следует использовать явное присвоение имен вашим компонентам, если только у вас нет нескольких компонентов с одним и тем же классом реализации, поэтому просто убедитесь, что вам это действительно нужно.

Комментарии:

1. Спасибо, Кшиштоф! На самом деле это было так просто — я много играл с api convention reg, но всегда чего-то не хватало. Строка, содержащая имя configuration, действительно не была нужна в моем случае.