首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >配置Ninject以返回结果列表

配置Ninject以返回结果列表
EN

Stack Overflow用户
提问于 2016-05-26 20:19:59
回答 1查看 335关注 0票数 1

我正在使用Ninject来解决依赖关系,到目前为止,它的工作还很顺利。在本例中,我实际上需要基于存储在App.config中的数据初始化的对象列表。

然而,尼尼姆总是返回一个空列表。下面的片段是我尝试过的一个例子。我已经为某些上下文包含了类层次结构的构造函数。

代码语言:javascript
复制
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的数据,所以当我每次请求一个类型的列表时,我都无法理解如何注册它而不只是接收相同的实例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-26 20:34:42

关联:Kernel.Get和构造器注入的不同行为 ->与ninject在执行kernel.Get<IList<T>>和解析ctor的IList<T>参数时的行为不匹配。

所以就这样说:

宁特的多注入特性在这里占据优先地位。每当九点弹出遇到对IEnumerable<T>IList<T>T[]的请求(但不包括ICollection<T>)时,它就会将请求转换为解析T的所有绑定(没有条件或具有匹配条件)。

试着做以下几点:

代码语言:javascript
复制
public interface INoMultiBindingList<T> : IList<T> { }

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

通过以下方式:

sbb公共ServiceSchedulerBuilder(INoMultiBindingList textExportServices) { textExportService = textExportServices;

代码语言:javascript
复制
 }
代码语言:javascript
复制
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;
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37470246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档