配置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的数据,因此我无法理解我如何注册它,而不是每次请求该类型的列表时都收到相同的实例。


相关:Ninject Kernel.Get和Constructor Injection之间的不同行为 - >在执行kernel.Get<IList<T>>和解析ctor的IList<T>参数时ninject的行为不匹配。

所以在这里:

ninject的多点注入功能在此处优先。 每当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;
});
链接地址: http://www.djcxy.com/p/66277.html

上一篇: Configuring Ninject to return a list of results

下一篇: Ninject to inject ILog dependency