Замок Виндзор не может найти инсталляторов в сборках
У меня есть код в моем global.axax:
protected void Application_Start()
{
WindsorContainer = new WindsorContainer();
WindsorContainer.Install(FromAssembly.InDirectory(new AssemblyFilter(AppDomain.CurrentDomain.RelativeSearchPath)));
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(WindsorContainer.Kernel));
//...
}
Когда я отлаживаю global.asax, код FromAssembly.InDirectory(newAssemblyFilter(AppDomain.CurrentDomain.RelativeSearchPath))
находит все мои dll проекта (есть 7 dll).
3 из них содержит реализацию IWindsorInstaller
интерфейс, например:
class WindsorInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
var services = AllTypes.FromThisAssembly().Where(type => type.Name.EndsWith("Service"));
container.Register(services
.WithService.DefaultInterfaces()
.Configure(c => c.LifestyleTransient()));
container.Register(Component.For<ISession>().ImplementedBy<AspnetSession>().
LifeStyle.Transient);
container.Register(Component.For<ICache>().ImplementedBy<AspnetCache>().
LifeStyle.Transient);
}
}
Но когда я устанавливаю точки останова, вызывается только 1 установщик, 2 других пропускаются. Забавно, но у меня есть другой рабочий проект, из которого я скопировал код.
2 ответа
Ваш класс установщика должен быть публичным. Ваш текущий класс установщика не имеет модификатора доступа, поэтому по умолчанию internal
- и невидим для Виндзора. Документы Castle указывают это здесь: https://github.com/castleproject/Windsor/blob/master/docs/installers.md.
Проверьте все имена сборок в Project->Right Click->Properties. при использовании type.Name.EndsWith("Service") ваше имя сборки и пространство имен по умолчанию могут не содержать слова (включая проект, из которого вы выполняете. Например, проект WebAPI или проект UnitTest). Вот почему вы не можете получить желаемую сборку.