Несколько 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, если можете.

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