#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, действительно не была нужна в моем случае.