Ошибка Ninject в WithConstructorArgument: нет доступных привязок, и тип не является самосвязываемым - PullRequest
0 голосов
/ 16 октября 2019

В решении C # у меня есть следующая настройка Ninject, фабричный класс, который выглядит следующим образом:

public class NinjectFactory : IHttpControllerActivator
{
    private readonly IKernel kernel;

    public NinjectFactory()
    {
        kernel = new StandardKernel();
        var bindings = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.BaseType == typeof(NinjectModule))
            .Select(t => (INinjectModule)Activator.CreateInstance(t))
            .ToArray();
        this.kernel.Load(bindings);
    }

    public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
    {
        return controllerType == null
            ? null
            : (IHttpController)kernel.Get(controllerType);
    }

    public T GetBinding<T>() where T : class
    {
        return kernel.Get<T>();
    }
}

и несколько модулей Ninject, например:

public class ModuleA: NinjectModule
{
    Bind<ILogging>().To<Logging>().InSingletonScope();
    Bind<IMapping>().To<Mapping>();
    ....
    ....
}

public class ModuleB: NinjectModule
{
    Bind<IDbTools>().To<DbTools>().InSingletonScope();
    ....
    ....
}

У меня также есть следующие два класса, которые я пытаюсь внедрить в третьем классе:

public class ClassA : ISomeInterface
{
    private readonly IDbTools dbTools;
    private readonly IMapping mapping;
}

public class ClassB : ISomeInterface
{
    private readonly IDbTools dbTools;
    private readonly IMapping mapping;
}

Класс, в который я добавляю, выглядит следующим образом:

public class SaveClass : ISaving
{
    private readonly IDbTools dbTools;
    private readonly IMapping mapping;
    private ISomeInterface classA;
    private ISomeInterface classB;

    public SaveClass(IDbTools dbTools, IMapping mapping, ISomeInterface classA, ISomeInterface classB)
    {
        ....
    }

Сложностьэтой проблемы возникает из-за того, что в классе SaveClass есть две зависимости одного типа, т. е. ISomeInterface. Когда я пытаюсь внедрить их, используя ключевое слово «WithConstructorArgument», я получаю сообщение об ошибке «Нет соответствующих привязок, и тип не является самосвязываемым». Ошибка происходит в следующем классе модулей Ninject:

public class ModuleC : NinjectModule
{
    this.Bind<ISomeInterface>().To<ClassA>().InRequestScope().Named("ClassA");
    this.Bind<ISomeInterface>().To<ClassB>().InRequestScope().Named("ClassB");

    this.Bind<ISaving>().<SaveClass>().InRequestScope()
    .WithConstructorArgument("classA", Kernel.Get<ISomeInterface>("ClassA"))
    .WithConstructorArgument("classB", Kernel.Get<ISomeInterface>("ClassB"));

}

Точное сообщение об ошибке:

{"Ошибка активации IDbTools
Нет доступных привязок, итип не является самосвязываемым.
Путь активации:
2) Внедрение зависимости IDbTools в параметр dbTools конструктора типа ClassA
1) Запрос на ISomeInterface

Предложения:
1) Убедитесь, что вы определили привязку для IDbTools.
2) Если привязка была определена в модуле, убедитесь, что модуль был загружен в ядро.
3) Убедитесь, что вы случайно не создали болееодно ядро.
4) Если вы используете аргументы конструктора, убедитесь, что имя параметра соответствует имени параметра конструкторов.
5) Если вы используете автоматическую загрузку модуля, убедитесь, что путь поиска и фильтры правильные.
"}

В чем здесь проблема?

Спасибо.

...