Несколько Ninject модулей, дающих странное поведение
Это немного сложный, но воспроизводимый в моей среде. Архитектура следующим образом;
BindingsLayer
+-NinjectBindingsModule
+-NinjectWebBindingsModule
ContractsLayer
+- ISomeService
+- IAnotherService
DomainLayer
+- SomeService : ISomeService
+- AnotherService : IAnotherService
{
public AnotherService(ISomeService) {}
}
PersistenceLayer
+- PBADBEntities (Entity framework context)
WebProjectA
+- Uses bindings in NinjectWebBindingsModule
ConsoleProjectB
+- Uses bindings in NinjectBindingsModule
Реализация Ninject модуля
class NinjectBindingsModule : NinjectModule
{
public override void Load()
{
Bind<PBADBEntities>().ToSelf();
Kernel.Bind(s => s.FromAssembliesMatching("MySolution.*.dll")
.SelectAllClasses()
.BindDefaultInterfaces()
);
}
}
class NinjectWebBindingsModule : NinjectModule
{
public override void Load()
{
Bind<PBADBEntities>().ToSelf();
Kernel.Bind(s => s.FromAssembliesMatching("MySolution.*.dll")
.SelectAllClasses()
.BindDefaultInterfaces()
.InRequestScope()
);
}
}
Теперь вышесказанное нарушается, если я запускаю веб-проект со следующей ошибкой;
Error activating ISomeService. No matching bindings are available, and the type is not self-bindable.
Однако, если я изменю привязки в NinjectBindingsModule
(для консольного приложения, а не для веб-проекта, который выполняется), к следующему;
class NinjectBindingsModule : NinjectModule
{
public override void Load()
{
Bind<PBADBEntities>().ToSelf();
Bind<ISomeService>().To<SomeService>();
Bind<IAnotherService>().To<AnotherService>();
}
}
Тогда веб-проект работает правильно. В веб-проекте нет явной ссылки на класс NinjectBindingsModule, и ни одна точка останова не попадет, если я добавлю туда. Точка останова получит удар, если я вставлю ее NinjectWebBindings
и продолжай нормально.
Это будет означать, что Ninject загружает или иным образом сканирует все модули в сборках, на которые ссылаются, и что-то делает с ними в отношении связывания. Любые идеи о том, как решить эту проблему, не имея отдельный проект на модуль?
1 ответ
Этот пост старый, но я решил опубликовать ответ здесь. Проблема оказалась ошибкой в Ninject, которая позже была исправлена в версии 3.2.1. Использование вышеприведенной архитектуры для других решений с более поздними версиями работало нормально, и проблема исчезла. Короче говоря, обновите Ninject, если можете.