Настройка Ninject для возврата списка результатов

Я использую Ninject для разрешения зависимостей, и до сих пор работает без сбоев. В этом примере мне действительно нужен список объектов, инициализированных на основе данных, хранящихся в моем App.config.

Тем не менее, Ninject продолжает возвращать пустой список. Фрагмент ниже - пример того, что я попробовал. Я включил конструкторы для иерархии классов для некоторого контекста.

public ServiceSchedulerBuilder(IList<ITextExportService> textExportServices)
{
    _textExportService = textExportServices;    
}

public TextExportService(IHotFolderManager hotFolder)
{
    _hotFolder = hotFolder;
}

public HotFolderManager(string baseFolderPath, string defaultFileSearchPattern)
{
    //Some IO
}

//In a Ninject AppModule...
Kernel.Bind<IList<ITextExportService>>().ToMethod(ctx => 
{ 
    var services = new List<ITextExportService>();

    foreach (var device in GetDevicesByEnvironment())
    {
        var service = ctx.Kernel.Get<ITextExportService>(new ConstructorArgument("hotFolder", ctx.Kernel.Get<IHotFolderManager>(
                                                                    new ConstructorArgument("baseFolderPath", device.Path),
                                                                    new ConstructorArgument("defaultFileSearchPattern", "*.jmf"))));

        services.Add(service);
    }
    return services;
});

Я подозреваю, что все это связано с тем, что у меня нет явной регистрации привязки для самого ITextExportService. Но так как реализация будет зависеть от данных из App.config, я не могу понять, как я могу зарегистрировать их, а не просто получать один и тот же экземпляр каждый раз, когда я запрашиваю список такого типа.

1 ответ

Решение

Связанный: Ninject различное поведение между Kernel.Get и Constructor Injection -> есть несоответствие с поведением ninject при выполнении kernel.Get<IList<T>> и разрешение IList<T> параметр ctor.

Так что вот так:

Многоинъекционная функция ninject имеет здесь приоритет. Всякий раз, когда ниндзя встречает запрос на IEnumerable<T>, IList<T> или же T[] (но AFAIR нет ICollection<T>) он переведет его в запрос на разрешение всех привязок (без условия или с условием соответствия) для T,

Попробуйте следующее:

public interface INoMultiBindingList<T> : IList<T> { }

public class NoMultiBindingList<T> : List<T>, INoMultiBindingList<T> { }

с:

sbb public ServiceSchedulerBuilder (INoMultiBindingList textExportServices) {textExportService = textExportServices;
}

Kernel.Bind<INoMultiBindingList<ITextExportService>>().ToMethod(ctx => 
{ 
    var services = new NoMultiBindingList<ITextExportService>();

    foreach (var device in GetDevicesByEnvironment())
    {
        var service = ctx.Kernel.Get<ITextExportService>(new ConstructorArgument("hotFolder", ctx.Kernel.Get<IHotFolderManager>(
                                                                    new ConstructorArgument("baseFolderPath", device.Path),
                                                                    new ConstructorArgument("defaultFileSearchPattern", "*.jmf"))));

        services.Add(service);
    }
    return services;
});
Другие вопросы по тегам